C++文件输入问题

标签 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] 是空行。任何人都可以解释为什么以及如何解决它吗?

最佳答案

问题是您将 >>> 运算符与对 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/

相关文章:

c++ - 我的 C++ 函数不断出现调试错误。我不确定我做错了什么

c++ - 将 QImage 传递给方法 - 指针混淆

c++ - 循环可变参数模板类参数

c++ - 将一个信号连接到多个插槽

c++ - 什么是 undefined reference / Unresolved external symbol 错误,如何解决?

c++ - 我在哪里可以找到好的 C++ 源代码?

c++ - 无需访问 vector 即可找到迭代器的末尾

c++ - C2676 : binary '<' : 'const _Ty' does not define this operator or a conversion to a type acceptable to the predefined operator

c++ - 如何设置依赖于其他参数的参数默认值?

c++ - qt | QPixmap 缩放不正确