2014-03-04 26 views
1

我想导入一个CSV文件到我的C++程序,但我有一些问题,并希望一些澄清。cplusplus导入csv无法识别第一列?

csv文件中的数据排列如下。正如你所看到的,我想导入12个单元格。

x, y, z, p 
1, 2, 3, 4 
5, 6, 7, 8 

我对导入功能说csv文件如下:

while (getline (myfile, stringg, ',')) 
    {   
     std::cout << "j: " << j << " " << stringg << std::endl; 

     j++; //Note: j counts each cell. 
    } 
    myfile.close(); 
} 

进口的一切完美的罚款。不过,似乎j已经停止计数。这应该不是这样,因为csv文件中的数字仍在打印。

j: 0 x 
j: 1 y 
j: 2 z 
j: 3 p 
1 
j: 4 2 
j: 5 3 
j: 6 4 
5 
j: 7 6 
j: 8 7 
j: 9 8 

现在我知道为什么我相信它是这样做的。每行的结尾最后没有逗号。然而!这仍然不解释为什么j停止计数?

+0

@Excelcius请不要编辑帖子来改变编码风格,以您的个人喜好。编码风格非常主观,常常没有对错。 – Lundin

+0

“j停止计数”是什么意思?我看到从j:0到j:9的严格递增顺序... – fnokke

+0

@Lundin好的,谢谢我明白你的意思,但是缩进是不必要的,最后只有一个不需要的右括号。无论如何,我的主要担心是错误的cout语句 – Excelcius

回答

3

j计数是正确的......如果你仔细看看你的文件将是这个样子

x, y, z, p'\n' 
1, 2, 3, 4'\n' 
5, 6, 7, 8'\n' 

你什么时候当j is 3线由getline()读取的值是p'\n'1,当在控制台上打印作为

j: 3 p 
1 

,歼递增,下一个标记在2读...同样的休息后..

+0

啊美丽!干杯。 – nimbus

0

getline正在读取输入,直到下一个','字符。在你的情况,这意味着stringg将包含这样的:在调试程序时

1. iteration: stringg == "x" 
2. iteration: stringg == " y" 
3. iteration: stringg == " z" 
4. iteration: stringg == " p\n1" // The fourth string contains the next line! 

这样的错误,这些应该是很容易看到。

解决此问题的一种方法可能是使用默认的getline逐行读取,并在此循环中将结果字符串拆分为使用','作为分隔符的更多部分。