使用getline()函数读取CSV文件无法正常工作

时间:2016-06-01 18:56:03

标签: c++ qt io

我正在使用QT中的应用程序,而且我对C ++ I / O不熟悉;我想从当前有2列和一些行的CSV文件中读取一些数据,例如:(1 | 10)(2 | 20)我只想将它们存储在这样的数组中(1,10,2, 20);对某些人来说,只有第二列的值才会存储在我的数组中。这是一些代码;我已多次检查过,但我仍然无法看到我做错了什么:

void readingFiles::openFile(){

ofstream myFile;
myFile.open("/home/Dan/Desktop/mainFile.csv" ,std::ios::app);}

void readingFiles::addReadings(int readings1 , int readings2){



    if(myFile.is_open()){

            myFile<<readings1<<","<<readings2<<"\r";
            myFile.close();


}
}

vector<int> values ;
ifstream iFile;
iFile.open("/home/Dan/Desktop/mainFile.csv");}
string data;

void readingFiles::read(){
  for(int i =0; std::getline(iFile,data, ',') ; i++){
             values.insert(values.end() , atoi(data.c_str())); 
             qDebug("vector list is %i" , values[i]);}
}

因此,我得到的结果是它读取第一列中的第一行,然后从第二列移动到读取,并且永远不会返回到第一列(1,10,20,30,40等)。同样,我想要得到的是(1,10,2,20,3,30等)。

1 个答案:

答案 0 :(得分:0)

您的问题是,第二次通话getline正在返回10\n2。然后atoi将此转换为10.因此您将丢失2. getline应该丢弃换行符,因此我不确定为什么会发生这种情况。这有点难看,但在10\n2中解析data以便在\n之后选择任何内容并添加到向量中。

我使用VC 2013对此进行了测试,这是带有分隔符的getline行为。我用Google搜索,看起来好像是getline分隔符将换行视为文字字符的行为。这有效:

string line;
for (int i = 0; std::getline(myFile, line); i++)
{
    stringstream ss(line);
    for (int i = 0; std::getline(ss, data, ','); i++)
    {
        values.insert(values.end(), atoi(data.c_str()));
    }
}
for (int i = 0; i < values.size(); i++)
{
    cout << "vec=" << values[i] << endl;
}