2017-02-22 72 views
-3

非工作代码:问题与ifstream的读取CSV数据

#include<iostream> 
#include<fstream> 
#include<string> 
int main(){ 
int id; string name;char comma ; double money; 
ifstream read("testfile.csv"); 
while (read >> id >> comma>> name >> comma >> money) 
{cout << id <<comma<<name<<comma<<money<< endl ;} 
read.close(); 
_getch(); 
return 0;} 

CSV文件数据&结构:

1,user1,999 2,user2,33 3,user3,337

但是,下面的工作正常。为什么这样?

while (read >> id >>comma>>name) {cout << id<<comma<<name <<endl ;}

+0

一些很好的阅读:http://stackoverflow.com/questions/1120140/how-can-i-read-and-parse-csv-files-in-c – NathanOliver

+0

@NathanOliver谢谢,正试图找出为什么替代代码起作用。 – CowardlyDog

回答

3

当你阅读使用>>一个字符串,它读取空间分隔字符串。如果读取的文本中没有空格,它将读取直到行的末尾(因为换行符是空格)。

由于这个原因,输入的“解析”会稍微与文件中的内容不同步,并且在尝试读取其中一个数字时会导致错误。

+0

+1 - 在哪里可以找到/学习以下信息? **当您使用>>读取字符串时,它会读取空格分隔的字符串** **,因为换行符是空格** – CowardlyDog

+0

@CowardlyDog对于大多数信息,我通常会转到[此参考wiki](http:// en.cppreference.com/w/cpp)。 [input/output reference](http://en.cppreference.com/w/cpp/io)当然有一个关于['std :: basic_istream']的章节(http://en.cppreference.com/w/cpp/io/basic_istream)(这是所有输入流的基类),它们依次链接到[in-class member'operator >>'overload](http://en.cppreference.com/w/ cpp/io/basic_istream/operator_gtgt)以及[非成员'运算符>>'重载](http://en.cppreference.com/w/cpp/io/basic_istream/operator_gtgt2)(用于字符串)。 –

+1

@CowardlyDog [续...]对于读取字符串,最后一个引用包含文本“如果满足以下条件之一,则提取停止:...找到空白字符...”。阅读字符串是空格分隔的。 :) –