【问题标题】:Make std::fstream write to end of file but read from beginning使 std::fstream 写入文件末尾但从头开始读取
【发布时间】:2020-02-10 07:07:25
【问题描述】:

标题很好地解释了这一点。我有一个我截断并写入的文件(作为控制文件初始内容的测试)。然后我想对该文件进行读/写操作。具体来说,我想写入文件的末尾,但从头开始读取。

程序:

// (1) Make an initial file (truncated std::ofstream) with some contents
// (2) Close initial file stream
// (3) Re-open file with read and write permissions (std::fstream)
// (4) Set stream read pointer to beginning of file
// (5) Set stream write pointer to the end of file

这个问题在某种程度上暗示了这一点,但是我应该使用什么std::fstream::openmode 位参数来打开文件(或者默认的std::fstream::in | std::fstream::out 是否足够好)?

【问题讨论】:

    标签: c++ file file-io fstream


    【解决方案1】:

    fstream 没有单独的读取和写入位置,您在从读取更改为写入时需要寻找。

    seekgseekp 都调用 pubseekpos,而 fstream 对输入和输出的作用相同:https://en.cppreference.com/w/cpp/io/basic_filebuf/seekpos

    根据您的用例,同一文件上的单独读取和写入流可能会起作用。

    【讨论】:

    • 谢谢!如果我围绕这个包装一个类,我想我可以使用一些成员来跟踪单独的读取和写入位置。您是否愿意使用成员函数 read()(将流的位置设置为上次读取的位置)和 write()(写入到末尾)来实现这一点?
    • 是的,这可能是正确的方法。但是请注意,读取缓冲区在搜索时会被丢弃,因此如果您先进行小读取,然后进行小写入,然后再进行小读取,则效率不会很高,在这种情况下,两个单独的流会更好
    • 如果文件被两个单独的流修改,我需要在每次写入文件时更新读取流,还是读取流会自动更新?
    • 这取决于你在做什么,如果你只附加到流的末尾,那么它就可以工作(如果读者到达当前的结尾,你可能需要清除 eof 标志文件),否则读取流可能在其读取缓冲区中有陈旧数据
    • 太棒了!我很感激。您能否在答案中概述此方法?看看一些代码会很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-03-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-20
    • 2011-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多