0

我想用单个文件流读取和写入二进制文件。以下代码尝试读取文件的第一部分,并使用它来覆盖文件的第二部分。但我发现我必须使用“seekp(pos [,ios_base::begin]);” 在写作之前。此外,“seekp”实际上并没有改变我代码中的位置,但它是必要的!任何人都可以解释一下吗?它应该更好地根据 c++ 标准。非常感谢!

#include <iostream>
#include <fstream>
using namespace std;

int main(){
    fstream flib ("tmp.txt", ios::in | ios::out |ios::binary | ios::trunc);
    if(!flib){
        cerr << "file open failed!" << endl;
        return 1;
    }
    int tmp;

    for(int i = 0; i<2 ; i++){//write 2 numbers
        flib.write((char*)&i, sizeof(tmp));
    }
    flib.seekg(0);
    while(flib.read((char*)&tmp, sizeof(tmp))){//read file contents
        cout <<tmp<<endl; 
    }
    flib.clear();
    flib.seekg(0);
    flib.read((char*)&tmp, sizeof(tmp));
    flib.seekp(sizeof(tmp)); //work
    //flib.seekp(sizeof(tmp), ios_base::beg); //work
    //flib.seekp(0, ios_base::cur); //not work
    //flib.seekp(sizeof(tmp), ios_base::end); //not work
    //flib.seekp(-sizeof(tmp), ios_base::end); //not work
    flib.write((char*)&tmp, sizeof(tmp));
    flib.clear();
    flib.seekg(0);
    while(flib.read((char*)&tmp, sizeof(tmp))){//read file contents
        cout <<tmp<<endl; 
    }

    return 0;
 }

评论:我发现如果我使用 flib.seekp(some_number, ios_base::cur); 使用非零 some_number,它可以工作。而且我使用vs2012 express编译器,这是一个错误吗?

4

1 回答 1

4

文件流使用 abasic_filebuf<>作为流缓冲区。C++03 标准有这样的说法class basic_filebuf<charT,traits>

27.8.1.1 类模板 basic_filebuf

basic_filebuf 类将输入序列和输出序列都与文件相关联。

对类 basic_filebuf 对象控制的序列的读写限制与使用标准 C 库FILE的读写限制相同。

特别是: - 如果文件未打开以进行读取,则无法读取输入序列。- 如果文件未打开以进行写入,则无法写入输出序列。- 为输入序列和输出序列维护一个联合文件位置。

不幸的是,它并没有说明当使用标准 C 库在读取和写入FILE对象之间转换时,您必须执行文件定位调用(或fflush()从写入操作转换到读取操作时)。请参阅https://stackoverflow.com/a/14879076/12711

于 2013-03-06T06:40:06.657 回答