C++ 字符串流的 EOF 在编译+执行环境之间有不同的结果

EOF for C++ string stream has varying results between compile+execution environments

提问人:Jayce444 提问时间:11/12/2021 更新时间:11/12/2021 访问量:139

问:

我的朋友正在做一个神经网络项目。从本教程中复制了一些代码,他使用这部分代码将文件中的数字行读取为向量:

void TrainingData::getTopology(vector<unsigned> &topology)
{
    string line;
    string label;

    getline(m_trainingDataFile, line);
    stringstream ss(line);
    ss >> label;
    if (this->isEof() || label.compare("topology:") != 0) {
        abort();
    }

    while (!ss.eof()) {
        unsigned n;
        ss >> n;
        topology.push_back(n);
    }

    return;
}

当使用 MinGW 编译和运行它时,数字行被正确读取。但是,当使用 WSL 编译和运行它时,最后一个数字会重复,即读取结果存储在向量中。3 2 13 2 1 1

为什么它在 WSL 中重复?难道不应该在读取最后一个数字后设置 EOF 位,以便它突破 while 循环吗?

C++ 神经网络 Windows-subsystem-for-Linux eof StringStream

评论

0赞 Jerry Jeremiah 11/12/2021
这回答了你的问题吗?为什么 iostream::eof 在循环条件(即 'while (!stream.eof())'))中被认为是错误的?
0赞 Jayce444 11/12/2021
@JerryJeremiah虽然这确实解释了为什么这不是一个好主意,但它实际上并没有回答我的问题,这就是为什么它们在 MinGW 与 WSL 之间有所不同的原因
0赞 Garr Godfrey 11/12/2021
但。。。这是一个坏主意的原因是因为它可能有所不同
0赞 Garr Godfrey 11/12/2021
getline应包含换行符。在你读完最后一个字符(换行符)之前,你还没有命中,这不仅仅是读数字。我的猜测是数据文件略有不同:一个有换行符,另一个没有eof

答: 暂无答案