在写作之前寻找?

时间:2013-03-06 06:24:13

标签: c++ fstream

我想用单个文件流读取和写入二进制文件。以下代码尝试读取文件的第一部分,并使用它来覆盖文件的第二部分。但我发现我必须使用“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编译器,这是一个bug吗?

1 个答案:

答案 0 :(得分:4)

文件流使用basic_filebuf<>作为流缓冲区。 C ++ 03标准可以说class basic_filebuf<charT,traits>

  

27.8.1.1 Class tempate basic_filebuf

     

类basic_filebuf将两个输入关联起来   序列和带文件的输出序列。

     

读取和写入由...控制的序列的限制   class basic_filebuf的对象与for相同   使用标准C库FILE进行读写。

     

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

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