В C ++, как правильно вставить строку в начале текстового файла? - PullRequest
2 голосов
/ 14 ноября 2010

Я создаю большой текстовый файл, первая строка - это резюме, которое зависит от содержимого.В настоящее время я вставляю итоговую строку, которая содержит то, что, как я ожидаю, будет в итоге, и после создания файла я сравниваю это с тем, что было фактически написано.Если информация отличается, я перезаписываю исходное резюме.

Код следует.

  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 ]

3 голосов
/ 14 ноября 2010

Как говорит Игнасио, большинство файловых систем не поддерживают вставку в файлы, не говоря уже о текстовых файлах.А понятие стандартной библиотеки 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 для добавления сводной информации в файлы.

Итак, если вы программируете систему, которая поддерживает несколько потоков, и не планируете переносить программу или данные в другие системы, вы можете рассмотретьфайл с несколькими потоками.

Третий вариант - эффективно реализовать это самостоятельно, имея два или более связанных файла.Например, один файл данных и один сводный файл.Например, с помощью соглашения об именовании, связывающего их.

Cheers & hth.,

3 голосов
/ 14 ноября 2010

Большинство файловых систем предназначены только для добавления данных в конце. Для вставки данных в начале необходимо переписать файл.

2 голосов
/ 14 ноября 2010

Краткий ответ: вы не можете просто добавить резюме к началу файла, как только в него будут записаны данные.Но вы все равно можете добиться желаемого эффекта.Только не записывайте все данные в файл за один раз.Если вы можете себе это позволить, держите его в некоторой буферной области, например в потоке строк.Затем, когда придет время для записи файла, сначала запишите сводку, а затем выведите содержимое буфера в файл.Другим способом было бы создать новый файл, написать там резюме и затем добавить содержимое исходного файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...