2017-02-22 108 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 [續...]對於讀取字符串,最後一個引用包含文本「如果滿足以下條件之一,則提取停止:...找到空白字符...」。閱讀字符串是空格分隔的。 :) –