是否可以仅用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();
有没有办法做到这一点,或者每次更改时都要重写整个文件?
谢谢
答案 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();
}
应该检查错误或告诉流在使用此代码时抛出异常....