无法使用 fstream 输出最后一行

cannot output the last row with fstream

void reverse_output(string s, fstream& file, streamoff initial_pos)
{
    const char* a = s.c_str();
    file.seekp(initial_pos, ios::beg);
    for (int i = s.length() - 1; i >= 0; i--)
    {
        file.put(a[i]);
    }
}
int main()
{
    string file_name = "E:\WorkSpace\ConsoleApplication2\Debug\2.txt";
    fstream file;
    file.open(file_name.c_str());

    string row;
    streamoff pos = 0;


    while (getline(file, row))
    {       
        reverse_output(row, file, pos);
        file.put('\n');
        pos = file.tellp();
        file.seekg(pos, ios::beg);
    }

    file.close();
    return 0;
}

我想编写一个程序来反转文件的每一行。
假设一个文件包含:

123456
qwe

将转换为同一文件包含:

654321
ewq

我写了上面的代码,但它们对最后一行不起作用。 我怀疑

while (getline(file, row))

是主要原因。谁能帮帮我,告诉我真正的原因?

您使用 while (std::getline(file, row)) 没问题。您的问题是文件的最后一行不包含换行符!读取最后一行时,它的结尾是通过触摸文件的结尾来确定的。当流到达文件末尾时,标志 std::ios_base::eofbit 被设置,即 file.eof() 产生 true.

您要做的下一个操作是尝试使用 file.seekp(...) 搜索流。对 seekp() 的调用会在文件上创建一个 std::ostream::sentry,当 file.good()false 时,它将转换为 false。设置 std::ios_base::eofbit 会导致 file.good() 变为 false。当 sentry 对象转换为 false 时,搜索操作失败并设置 std::ios_base::failbit

解决该问题的最简单方法是在 while 循环开始时重置 std::ios_base::eofbit

while (getline(file, row))
{       
    file.clear();
    // ...
}

由于从 std::getline() 返回的流转换为 true,因此只能设置 std::ios_base::eofbit:如果设置了 std::ios_base::failbitstd::ios_base::badbit ,流将转换为 false.