在C ++中,在文本文件的开头插入一行的正确方法是什么?

时间:2010-11-14 19:53:06

标签: c++ file-io

我正在创建一个大文本文件,第一行是摘要,它取决于内容。我目前正在插入一个摘要行,其中包含我希望摘要的内容,在创建文件后,我将其与实际编写的内容进行比较。如果信息不同,我会覆盖初始摘要。

代码如下。

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

我想知道是否可以只追加到文件的开头,插入新行或单个字符 谢谢

3 个答案:

答案 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)

简短的回答是,一旦数据写入文件,您就不能将摘要添加到文件的开头。但是你仍然可以达到预期的效果。只是不要将所有数据写入文件中。如果你能负担得起,请把它放在一些缓冲区,比如字符串流。然后,当写入文件的时候,首先编写摘要,然后将缓冲区的内容转储到文件中。另一种方法是创建一个新文件,在那里写入摘要,然后附加原始文件的内容。