C++ getline 和 stringstream

wfm*_*n17 5 c++ stringstream getline

我正在尝试读入一个文件,该文件有 5 行,每行有 3-4 个字符串长。这是我的输入文件:

10:30 Hurley 1234567A 10:15
10:45 Hurley 1234567A 11:30
08:35 Jacob 1x1x1x1x1x
08:35 Jacob 1x1x1x1x1x 08:10
08:05 Jacob 1x1x1x1x1x
08:45 Sayid 33332222 09:15
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:

10:30 Hurley 1234567A   10:15
10:45 Hurley 1234567A   11:30
08:35 Jacob  1x1x1x1x1x 11:30
08:35 Jacob  1x1x1x1x1x 08:10
08:05 Jacob  1x1x1x1x1x 08:10
08:45 Sayid  33332222   09:15
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

void enor::Read(status &sx,isle &dx,ifstream &x){
    string str;
    getline(x, str, '\n');
    stringstream ss;
    ss << str;
    ss >> dx.in >> dx.name >> dx.id >> dx.out;
    /*getline(x, str, '\n');
    x>>dx.in>>dx.name>>dx.id>>dx.out;*/
    if(x.fail())
        sx=abnorm;
    else
        sx=norm;
}
Run Code Online (Sandbox Code Playgroud)

如何读取文件而不用第 3 行和第 5 行填充第 2 行和第 4 行的时间?我希望 dx.out 为空。我应该使用其他方法,还是可以使用 stringstream 来完成?

Aas*_*set 5

如果>>看到 中没有留下任何内容stringstream,它将保持变量不变 - 因此dx.out保留最后一行的值。但是,你可以这样做

ss >> dx.in >> dx.name >> dx.id;
if (!(ss >> dx.out))
    dx.out = "";
Run Code Online (Sandbox Code Playgroud)

因为ss >> dx.out返回ss,并且当流转换为 a 时bool(例如在条件中使用它时),如果上次读取尝试失败,if则返回。false