2011-08-27 73 views
1

嗨!我有以下代碼:C++文件輸入問題

#include <iostream> 
#include <fstream> 
#include <vector> 
using namespace std; 
#define MAXN 301 

string names[MAXN]; 
vector<string> names_vec; 

int main(int argc, char **argv) 
{ 
    ifstream fin(argv[1]); 
    int n; 
    fin>>n; 
    string line; 
    while(getline(fin, line)) 
     names_vec.push_back(line); 
    for(int i=0; i<names_vec.size(); i++) 
     cout<<names_vec[i]<<endl; 
    return 0; 
} 

和names.in文件輸入:

5 
CLEOpatra 
AISHWARYA rai 
jOHn f. KeNNeDy 
leonardo DA Vinci 
tyleR durdeN 

當我編譯並運行它第一次印空行,即names_vec [0]是空行。任何人都可以解釋爲什麼以及如何修復它?

+0

的可能重複(http://stackoverflow.com/questions/6642865/getline-not-asking-for-input) – ildjarn

回答

6

問題是,您正在混合>>運營商與調用getline。一般來說,你想使用其中一種,但不能將它們同時使用。

你在向量中得到一個空字符串的原因是因爲>>不會消耗導致它停止的空白。即它讀取"5",在它之後找到換行符,然後停止,並將換行符保留在ifstream中。

然後,呼叫getline遇到換行符,並立即說:「完成了!我讀了一行!」。它消耗換行符,並返回導向它的整個字符串 - 在這種情況下,它是空字符串。

如果您知道您的數據將被正確格式化(沒有無效輸入),那麼使用>>來讀取整個文件可能是最簡單的。否則,我會建議使用getline逐一讀取每一行,然後使用一個stringstream對象來解析數據。

編輯

我只注意到你輸入的其餘部分具有第一/用空格分隔姓氏。由於>>在空格處停止,因此使用getline來讀取整個文件可能是最簡單的。讀取5例如:[?函數getline不要求輸入]

string line; 
getline(fin, line); 

stringstream converter; 
converter << line; 

int n; 
converter >> n; 
+0

太好了!非常感謝! – user873286

+1

@user:如果你發現答案有幫助,你應該通過選擇答案左邊的綠色箭頭來「接受」它。 –