使用带有CSV的getline

时间:2012-09-02 09:05:50

标签: c++

我花了近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])

我该如何解决这个问题?

4 个答案:

答案 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。使用'而不是"来表示字符常量。