2011-08-27 109 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:如果你发现答案有帮助,你应该通过选择答案左边的绿色箭头来“接受”它。 –