我正在创建一个大文本文件,第一行是摘要,它取决于内容。我目前正在插入一个摘要行,其中包含我希望摘要的内容,在创建文件后,我将其与实际编写的内容进行比较。如果信息不同,我会覆盖初始摘要。
代码如下。
std::ofstream ofile(filename);
numOutSegInSynth-=computeSegmentsFromLevel(numLevelsInSynth-1,myInitCkt);
//extra padding inserted, to prevent summary overwriting segments
ofile<<numNodesInSynth<<" "<<numOutSegInSynth<<" 0"<<std::endl;
ofile.close();
for (long i=0; i<(numLevelsInSynth-1); i++) {
//at all
long numSegOnLevel = computeSegmentsFromLevel(i,myInitCkt);
assert(numSegOnLevel);
numSegsCreated+=numSegOnLevel;
buildSegmentsList(i,numSegOnLevel,filename,myInitCkt);
}
if (numSegsCreated != numOutSegInSynth) {
//update segment count
std::ofstream ofile(filename, ios::in | ios::out );
ofile.seekp(0, ios::beg);
short pred = log10(numOutSegInSynth)+1;
short act = log10(numSegsCreated)+1;
if (act>pred) {
ofile<<numNodesInSynth<<" "<<numSegsCreated<<" 0"<<std::endl;
} else {
ofile<<numNodesInSynth<<" "<<numSegsCreated<<" 0"<<std::endl;
}
ofile.close();
}
我想知道是否可以只追加到文件的开头,插入新行或单个字符 谢谢
答案 0 :(得分:3)
大多数文件系统只能在最后添加数据。在开头插入数据需要重写文件。
答案 1 :(得分:3)
正如Ignacio所说,大多数文件系统不支持插入文件,更不用说文本文件了。 C ++标准库的文件概念是一个简单的字节流。因此,一开始就有一个固定大小的摘要,因为您似乎打算使用您的代码,这是一个实用的解决方案(注意:您的代码似乎没有达到这个固定大小)。
但是,某些常见的文件系统确实支持将额外信息与文件相关联。
例如,Windows NTFS支持每个文件多个数据流:
C:\test> echo blah blah >data.txt C:\test> type data.txt blah blah C:\test> echo some info >data.txt:summary C:\test> type data.txt blah blah C:\test> more <data.txt:summary some info C:\test> _
,例如,这是Windows资源管理器用于向文件添加摘要信息的机制。
因此,如果您正在为支持多个流的系统进行编程,并且不打算将程序或数据移植到其他系统,则可以考虑使用多流文件。
第三种选择是通过拥有两个或更多相关文件来有效地实现它。例如。一个数据文件和一个摘要文件。用例如连接它们的命名约定。
干杯&amp;第h。,
答案 2 :(得分:2)
简短的回答是,一旦数据写入文件,您就不能将摘要添加到文件的开头。但是你仍然可以达到预期的效果。只是不要将所有数据写入文件中。如果你能负担得起,请把它放在一些缓冲区,比如字符串流。然后,当写入文件的时候,首先编写摘要,然后将缓冲区的内容转储到文件中。另一种方法是创建一个新文件,在那里写入摘要,然后附加原始文件的内容。