我花了近4个小时试图解决这个问题...
我有一个超过100行的文本文件。每行有4个以逗号分隔的值。我希望能够提取每个值并将其保存到变量(v1 ... v4)中。
我使用了for循环,因为我不会读取文件的全部内容。我现在只是想让1人工作。
到目前为止,我已经成功阅读了一行。我现在只需打破这一行。这是我的Uni任务,我不允许使用任何boost或tokeniser类。只需getline和其他基本命令。
我有这段代码:
// Read contents from books.txt file
ifstream theFile("fileName.txt");
string v1, v2, v3, v4, line;
for (int i = 0; i < 1; i++) {
getline(theFile, line, '\n');
cout << line << endl; // This part works fine
getline(line, v1, ","); // Error here
cout << v1 << endl;
getline(line, v2, ","); // Error here
cout << v2 << endl;
getline(line, v3, ","); // Error here
cout << v3 << endl;
getline(line, v4, '\n'); // Error here
cout << v4 << endl;
}
theFile.close();
我得到的错误是 - 错误:没有匹配函数来调用'getline(std :: string&amp;,std :: string&amp;,const char [2])
我该如何解决这个问题?
答案 0 :(得分:2)
getline的分隔符是一个字符。您使用了双引号","
表示字符串(因此编译器错误表明您使用了char[2]
- 字符串文字包含额外的'nul'字符)。
单个字符值使用单引号代替:
getline(myFile, v1, ',');
编辑 - 我刚刚注意到你传递字符串作为第一个参数,getline不支持(它不会让你检索令牌)直接来自一个字符串)。你可能想把字符串填入stringstream
而不是
#include <sstream>
// etc ...
std::string csv = "the,cat,sat,on,the,mat";
std::istringstream buffer( csv );
std::string token;
while( std::getline( buffer, token, ',' ) )
{
std::cout << token << std::endl;
}
答案 1 :(得分:2)
根据this页面,您必须以getline
作为第一个参数致电std::istream
。
但line
的类型为std::string
。您应该传递一个std::istream
,这可以
可以通过std::istringstream
创建line
来完成。这可能有效:
string v1, v2, v3, v4, line;
istringstream line_stream;
for (int i = 0; i < 1; i++) {
getline(theFile, line, '\n');
cout << line << endl;
line_stream.str(line); // set the input stream to line
getline(line_stream, v1, ","); // reads from line_stream and writes to v1
...
如果您想了解有关std::istringstream
的更多信息,可以执行here。
此外,根据上面的页面,第三个参数必须是char
类型。但是你传递了","
,它会自动转换为const char[2]
,一个字符串。对于字符,请使用'c'
。
答案 2 :(得分:0)
string filename, text, line;
vector<string> v1;
vector<string> v2;
vector<string> v3;
vector<string> v4;
int i = 0, k = 0, n;
cout << "Enter filename." << endl;
cin >> filename;
cout << "How many lines of text are in the file?" << endl;
cin >> n;
cin.ignore(200, '\n');
ifstream file(filename.c_str());
if (!file) {
cerr << "No such file exists." << endl;
exit(1);
}
cin.ignore(200, '\n');
if (file.is_open()) {
while (file.good()) {
for (k = 0; k < n; k++) { //Loops for as many lines as there are in the file
for (i = 0; i < 4; i++) { //Loops for each comma-separated word in the line
getline(cin, text, ',');
if (i == 0)
v1.push_back(text);
else if (i == 1)
v2.push_back(text);
else if (i == 2)
v3.push_back(text);
else if (i == 3)
v4.push_back(text);
}
}
}
}
file.close();
return 0;
}
答案 3 :(得分:0)
std :: getline有两个重载:
istream& getline ( istream& is, string& str, char delim );
istream& getline ( istream& is, string& str );
您的三个调用将文字字符串常量作为第三个参数传递,其中需要一个char
。使用'
而不是"
来表示字符常量。