我需要打开一个文件作为ofstream并写入文件的前面,同时保留 文件的剩余内容,将被“移动”。与“prepend”相似 一个文件。
这可以使用STL还是提升?
答案 0 :(得分:16)
不 - 这里的语言(或库)并没有太大的区别。大多数文件系统都不允许它,完全停止。
获得相同效果的常用方法是将新数据写入新文件,然后根据您编写的数据将旧文件中的数据复制到新文件中。
答案 1 :(得分:5)
不,不是。这之前已经多次被问过了。如果要执行此操作,则必须创建新文件,将“prepend”数据写入其中,然后打开现有文件并将其内容复制到新文件中。
答案 2 :(得分:1)
新的iostream
类可以包装该功能。这假设您的前置数据不是太大而不能舒适地适合内存。像常规ofstream
一样使用它。
#include <fstream>
#include <sstream>
#include <vector>
class prepend_ofstream
: public std::ostringstream {
std::filebuf file;
public:
prepend_ofstream() {}
prepend_ofstream( char const *name, openmode mode = out ) {
open( name, mode );
}
~prepend_ofstream() {
if ( is_open() ) close();
}
void open( char const *name, openmode mode ) {
if ( ! file.open( name, mode & binary | in | out ) ) {
setstate( failbit );
}
}
bool is_open() { return file.is_open(); }
void close() {
if ( ! is_open() ) {
setstate( failbit );
return;
}
char *strbuf = &str()[0];
std::vector<char> buf( str().size() );
int rdsz;
do {
rdsz = file.sgetn( &buf[0], buf.size() );
file.pubseekoff( -rdsz, cur );
file.sputn( strbuf, buf.size() );
file.pubseekoff( 0, cur ); // "update the output sequence"
std::copy( &buf[0], &buf[0]+rdsz, strbuf );
} while ( rdsz == buf.size() );
file.sputn( &buf[0], rdsz );
if ( ! file.close() ) {
setstate( failbit );
}
}
};
通常,功能是通过新的流缓冲区类添加的,而不是实际的流,但在这种情况下,新功能位于close
,遗憾的是它不是虚拟的。