使用c ++仅更新二进制文件的一部分

时间:2010-08-18 14:31:41

标签: c++ stream

是否可以仅用c ++更新文件的一部分?

示例:

旧档案A:'A''A''A''B''B'''C'''C'
新文件A:'A''A''A''X''X''C''C''C'

因为真实文件不像这些例子那么小,而且我确实知道改变了什么(更改内容的偏移和writeLenght),能够打开文件,将流设置到正确位置会很棒,写入信息并再次关闭文件....但这将导致一个看起来像这样的文件:

更新文件:'0''0''0''X''X''C''C''C'

这是我使用的代码:

void update file( list<unsigned char> content, int offset){

fs::basic_ofstream< char > fileStream( path , ios::out | ios::binary );    
list< unsigned char >::const_iterator contentIter = content.begin();
// begin write operation at the offset
advance( contentIter , offset);
fileStream.seekp( offset );
while( contentIter != content.end() ){
    unsigned char value = (char)*contentIter;
    fileStream.put( value );
    ++contentIter;          
}
fileStream.close();

有没有办法做到这一点,或者每次更改时都要重写整个文件?

谢谢

3 个答案:

答案 0 :(得分:7)

你有很多正确的想法。您需要更改的主要内容是使用fstream而不是ofstream,并在打开它时使用ios::in | ios::out(假设fs::basic_ofstream以某种方式解析为std::basic_ofstream) 。当您使用ios::out打开时,现有文件内容将被销毁。

编辑:顺便说一句,我很难想象使用std::list<char>是个好主意的情况。在具有32位指针和8位char的典型计算机上,您正在考虑使用8倍于指针的空间,就像您要存储的数据和访问权限一样您存储的数据通常也很慢。

答案 1 :(得分:4)

不像c ++那样,但显而易见的方法是使用内存映射文件

答案 2 :(得分:4)

好的,谢谢你:
如果有人遇到同样的问题,这是一段有效的代码。

void update file( list<unsigned char> content, int offset, int writeLength){ 

fs::basic_fstream< char > fileStream( path , ios::out | ios::in | ios::binary );     
 list< unsigned char >::const_iterator contentIter = content.begin(); 
 // begin write operation at the offset 
 advance( contentIter , offset); 
 // set the Stream to the offset position
 fileStream.seekp( offset ); 
 while( contentIter != content.end() && writeLength != 0){ 
    unsigned char value = (char)*contentIter; 
    fileStream.put( value ); 
    ++contentIter; 
    --writeLength;          
 } 
fileStream.close(); 
}

应该检查错误或告诉流在使用此代码时抛出异常....