gpt4 book ai didi

c++ - 将字符串拆分为标记并将标记分成两个单独的数组

转载 作者:太空宇宙 更新时间:2023-11-04 14:29:06 26 4
gpt4 key购买 nike

我正在尝试创建一个函数 readBooks,它打开一个输入文件流,读取以逗号分隔的书籍和作者列表,文件的每一行都有 1 本书和作者对(例如:Douglas Adams,The银河系漫游指南)。我遇到了问题,我应该如何标记或拆分字符串,以便我可以使用逗号作为分隔符将作者和书名插入到两个单独的数组中。感谢您的帮助。

数组的大小由函数中的容量参数定义。数组在调用 readBooks() 函数之前分配,因此无需动态分配它们。

这是我目前的代码:

int readBooks (string filename, string titles[], string authors[], int books, int capacity){
ifstream file;
file.open (filename);
if (file.fail()){
return -1;
}
else{
int i = 0;
int j = 0;
while (i < capacity){
string line;
getline (file, line);
if (line.length() > 0){

}
}
}
}

最佳答案

使用 boost 库会更简单一些,您可以在其中检查多个分隔符。但是,您可以使用 getline() 搜索行尾定界符,然后使用 find() 查找逗号。找到逗号后,您必须确保在标题之前超过它,并剪掉所有空格。

#include <iostream>
#include <fstream>
#include <string>
#include "readBooks.h"

#include <algorithm>
#include <cctype>
#include <locale>

/* trim from start (in place) [Trim functions borrowed from
* https://stackoverflow.com/questions/216823/whats-the-best-way-to-trim-stdstring]
*/

static inline void ltrim(std::string &s) {
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) {
return !std::isspace(ch);
}));
}

// trim from end (in place)
static inline void rtrim(std::string &s) {
s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) {
return !std::isspace(ch);
}).base(), s.end());
}

// trim from both ends (in place)
static inline void trim(std::string &s) {
ltrim(s);
rtrim(s);
}


using namespace std;

int readBooks (string filename, string titles[], string authors[], int books, int capacity){
ifstream file;
file.open (filename);
if (file.fail()){
return -1;
}
else{
int i = 0;
string line;

while( i < books && i < capacity && getline(file,line) ) {
// Find the position of the comma, and grab everything before it
string author(line.begin(), find(line.begin(), line.end(), ','));
trim(author);
authors[i] = author;
// Find position of first character after the ','
string title(find(line.begin(), line.end(), ',') + 1, line.end());
trim(title);
titles[i] = title;
i++; // increment our index
}
}
file.close();
return 0;
}

这是调用它的示例 main()。

#include <iostream>
#include "readBooks.h"

int main() {

const int capacity{1000};
const int books{3};
std::string authors[capacity];
std::string titles[capacity];
std::string filename{"booklist.txt"};

int retval = readBooks(filename, titles, authors, books, capacity);

return retval;
}

关于c++ - 将字符串拆分为标记并将标记分成两个单独的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52897096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com