我正在使用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等)。
答案 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;
}