代码之家  ›  专栏  ›  技术社区  ›  Auxiliary

C++,同时读取和写入二进制文件

  •  2
  • Auxiliary  · 技术社区  · 16 年前

    我想知道是否可以用“fstream”从二进制文件中读取一个字节,然后更改该字节并将其写回。 我试过这段代码,但没用,什么也没发生,但我确信它读起来是正确的。

    file.open(path, ios::in|ios::out|ios::binary|ios::ate);
    file.seekg(0, ios::end);
    int size=file.tellg();
    file.seekg(0,ios::beg);
    char buffer;    
    for(int i=0;i<size;i++)
    {
        file.read((char*)&buffer,sizeof(char));
        buffer=(buffer+7)%256;
        file.write((char*)&buffer, sizeof(char));
    }
    

    在这样读取之后,我是否应该将文件指针移回一个字节:

    file.seekg(-1, ios::cur);
    

    提前谢谢。

    4 回复  |  直到 16 年前
        1
  •  6
  •   Yukiko    16 年前

    对。正如您在问题中所建议的,如果要覆盖以前读取的字节,则需要使用seekg调整文件指针的位置。每次读取后,文件指针将位于读取字节之后。

        2
  •  2
  •   Charles    16 年前

    您应该将指针移回以前读取字节的数量;对于char-1也是如此。

    file.seekg(-1, std::ios::cur);
    

    请考虑在修改数据时,它必须具有相同的字节大小,否则将覆盖文件中的其他数据。

        3
  •  1
  •   Kornel Kisielewicz    16 年前

    也就是说,在您的情况下,读取数据块,然后将其转换到内存中,然后将其写回可能会更高效。

        4
  •  0
  •   Community Mohan Dere    9 年前

    file.open(path, ios::in|ios::out|ios::binary|ios::ate);
    if ( ! file.is_open() ) {
        throw "open failed";
    }
    

    然后,您必须始终检查预期工作的读写操作是否有效:

    if ( ! file.read((char*)&buffer,sizeof(char)) ) {
       throw "read failed";
    }
    

    最后,您应该检查您正在使用的开放标志的组合在您的特定平台上是否有效-请参见 Why can't I read and append with std::fstream on Mac OS X? 对于这方面的一些讨论,我建议删除代码中的ios::ate标志。