2010-08-18 67 views
5

是否可以仅更新C++中的文件的一部分?用C++更新二进制文件的一部分

例子:

旧文件答:'A''A''A''B''B''C''C''C'
新文件:“ A''A''A” ‘X''X’‘C''C''C’

为真正的文件是不是像细小这些例子,我不知道到底发生了什么变化(offset和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

好的,谢谢您:
这里是代码的情况下,任何人一块工作遇到了同样的问题。

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(); 
} 

每个人都应该检查错误或告知使用此代码时,抛出异常流....

7

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

编辑:顺便说一下,我很难想象使用std::list<char>是一个好主意的情况。在使用32位指针和8位char的典型机器上,您正在使用指针的8倍空间来存储您试图存储的数据,并且您可以访问数据商店一般也很慢。

+0

谢谢您的回答。这正是我所期待的。 关于字符:我正在为闪存卡写一个压力测试程序。我必须能够在每个字节具有定义的值的情况下生成模式。这些模式存储在内部并写入文件。我不时读回来,并将它们与存储的模式进行比较。然后我可以知道错误的确切位置,并检查它是否可以重现。 – zitroneneis 2010-08-19 08:47:46

3

还不如C++'杂交,但明显的方式就是使用内存映射文件