C++文件输入问题

use*_*286 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;
}
Run Code Online (Sandbox Code Playgroud)

和names.in文件输入:

5
CLEOpatra
AISHWARYA rai
jOHn f. KeNNeDy
leonardo DA Vinci
tyleR durdeN
Run Code Online (Sandbox Code Playgroud)

当我编译并运行它时,首先打印空行,name_vec [0]为空行.任何人都可以解释为什么以及如何解决它?

Daw*_*son 6

问题是你正在将>>操作员与调用混合getline.通常,您希望使用其中一个,但不能同时使用它们.

你在向量中得到一个空字符串的原因是因为>>不会消耗导致它停止的空格.也就是说,它读取"5",找到后面的换行符,然后停止,将换行符保留在ifstream.

然后,getline遇到换行符的调用立即说:"完成!我读了一行!".它使用换行符并返回导致它的整个字符串 - 在本例中是空字符串.

如果您知道数据格式正确(没有无效输入),则最简单的方法就是>>用来读取整个文件.否则,我建议使用一次getline读取每一行,然后使用stringstream对象解析数据.

编辑

我只是注意到你输入的其余部分有以空格分隔的名/姓.由于>>在空格上停止,因此最简单的方法是使用它getline来读取整个文件.阅读示例5:

string line;
getline(fin, line);

stringstream converter;
converter << line;

int n;
converter >> n;
Run Code Online (Sandbox Code Playgroud)