c++ - 无法使用 fstream 输出最后一行

标签 c++ fstream put

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 时,它​​将转换为 false。 good()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 .

关于c++ - 无法使用 fstream 输出最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34388460/

相关文章:

c++ - 处理受向 std::vector 添加元素影响的引用

c++ - 如何在Cocos2d-x中检测我是否需要使用超高清、高清或标清

c++ - 创建类实例变量的问题

c++ - fstream 和 ofstream

c++ - C++中文件数据的动态分配

c++ - 最大用户模式调度程序线程数

c++ - 为什么替换字符串会替换另一个字符串的一部分?

php - 使用 API PUT 请求上传文件

PHP 访问传入的 PUT 数据

jquery - 从HTTP获取数据