大家好!我有以下代码:
#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] 是空行。任何人都可以解释为什么以及如何解决它吗?
最佳答案
问题是您将 >>>
运算符与对 getline
的调用混合在一起。通常,您想使用其中之一,但不能同时使用它们。
在 vector 中得到空字符串的原因是 >>>
不会消耗导致它停止的空格。也就是说,它读取 “5”
,找到它后面的换行符,然后停止,将换行符留在 ifstream
中。
然后,对 getline
的调用遇到换行符并立即说:“完成!我读了一行!”。它使用换行符并返回指向它的整个字符串——在本例中是空字符串。
如果您知道您的数据将被正确格式化(无无效输入),那么使用 >>>
读取整个文件可能是最简单的。否则,我建议使用 getline
一次读取每一行,然后使用 stringstream
对象解析行外的数据。
编辑
我刚刚注意到您输入的其余部分的名字/姓氏由空格分隔。由于 >>>
停在空格处,使用 getline
读取整个文件可能是最简单的。读取 5
的示例:
string line;
getline(fin, line);
stringstream converter;
converter << line;
int n;
converter >> n;
关于C++文件输入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7211714/