2014-10-26 60 views
0

好吧,所以我有一個輸入文件input.txt,它包含一個CSV序列:1,1,1,2,2,3,3,4,4 我試圖用逗號分隔它;但是我在這裏遇到了一些問題。出於某種原因,序列中的第一個數字甚至沒有被流讀取。爲了表明這一點,我創建了一些調試代碼來查看發生了什麼,並且我發現第一個數字被存儲在csvLine之內,並且每個其他數字都被讀取和轉換得很好。我不明白爲什麼只有第一個號碼被省略。下面是一個示例圖,顯示我的意思。 num應該具有相同的確切值和Line,但事實並非如此。它具有除第一個以外的所有值,它們存儲在csvLine之內。這是爲什麼發生?!爲什麼C++ StringStream從輸入文件中跳過第一個數字,但是顯示其餘的?

program output showing how it skips the first number

#include <iostream> 
#include <fstream> 
#include <sstream> 
using namespace std; 

int main(int argc, const char * argv[]) { 
    ifstream file; 
    string line; 
    string csvLine; //comma seperated value line 
    int num = 0; 
    file.open(argv[1]); 
    if(file.is_open()) { 
     while(getline(file, line)) { //get the whole line and use string stream to break at commas 
      cout << "\nLine: " << line << endl; 
      //using stringstream to seperate at commas 
      stringstream ss(line); 
      while(getline(ss, csvLine, ',')) { 
       cout << "csvLine: " << csvLine << " " << endl; 
       //using stringstream to convert to int 
       ss >> num; 
       cout << "num: " << num << " " << endl; 
      } 
     } 
    } 
    return 0; 
} 
+0

不要混合'getline'和'>>'。 http://stackoverflow.com/questions/21567291/why-does-stdgetline-skip-input-after-a-formatted-extraction – chris 2014-10-26 20:00:33

回答

2

問題就出現了,因爲你使用getline,然後從stringstream

當你讀getline(ss, csvLine, ',')第一隻應使用getline

while(getline(ss, csvLine, ',')) 
{ 
    cout << "csvLine: " << csvLine << " " << endl; 
    num = std::stoi(csvLine) ;   
} 
1

提取整數它會讀取數字後跟','。對於下一個數字,它只是讀取逗號,因爲該號碼已使用ss >> num提取。也就是說,最簡單的解決方法是在循環執行後只讀取一切,幷包括逗號。由於不使用字符串中提取逗號的值是有意義的使用ignore()而不是std::getline()

for (; ss >> num; ss.ignore(std::numeric_limits<std::streamsize>::max(), ',')) { 
    // do something with the number 
} 

重組環路這樣有檢查讀取次數是否成功的額外好處。

相關問題