#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
当我编译并运行它时,首先打印空行,name_vec [0]为空行。任何人都可以解释为什么以及如何解决它?
答案 0 :(得分:6)
问题在于您将>>
运算符与getline
的调用混合在一起。通常,您希望使用其中一个,但不能同时使用它们。
你在向量中得到一个空字符串的原因是因为>>
不会消耗导致它停止的空格。也就是说,它会读取"5"
,在其后面找到换行符,然后停止,将换行符保留在ifstream
中。
然后,对getline
的调用遇到换行符并立即说:“完成!我读了一行!”。它使用换行符并返回导致它的整个字符串 - 在本例中为空字符串。
如果您知道您的数据格式正确(没有无效输入),最简单的方法就是使用>>
来读取整个文件。否则,我建议使用getline
一次读取每一行,然后使用stringstream
对象来解析数据。
修改强>
我刚刚注意到你输入的其余部分有以空格分隔的名/姓。由于>>
在空格上停止,因此使用getline
读取整个文件可能最简单。阅读5
:
string line;
getline(fin, line);
stringstream converter;
converter << line;
int n;
converter >> n;