Изменение текста блокнота - PullRequest
2 голосов
/ 28 февраля 2011

Я пытался написать код, в котором:

  %# Matlab reads a notepad file.

  f_id=fopen('n1.txt','r');
  reports=textscan(f_id, '%s', 'Delimiter', '\n')
  fclose(f_id)
  reports_saved=reports{1} ;
  P='blah blah'

РЕДАКТИРОВАТЬ:

 goes to a specific line of the text file.
X=ftell(f_id)
Ai=fseek(f_id, 0, 'cof')
 fprintf(f_id,'%s', P);
 fclose(f_id)

Первая строка, где указатель 'cof' был перезаписан. Теперь, Проблема 1: Если новый текст короче существующего, символы из существующего текста остаются после перезаписи. Любые намеки почему? Проблема 2: 'fseek' позволяет перейти только к началу, текущей позиции или концу файла. Есть ли способ заставить указатель перемещаться случайным образом, как при переходе к тексту №4 / 5. Обратите внимание, что каждый текст содержит пустую строку между ними.

Любая помощь приветствуется.

Ответы [ 2 ]

3 голосов
/ 28 февраля 2011

Текстовый файл - это набор непрерывных байтов на диске. Если вы измените длину любого сегмента текста в середине файла, вам нужно переписать все последующие байты файла, а затем обрезать или расширить файл. Они не сдвигаются автоматически. Это похоже на вставку или удаление из структуры массива в памяти (на языке более низкого уровня, таком как C, который не изменяет размеры массивов автоматически, как это делает Matlab), а не на связанный список.

Работа напрямую с файлом, вероятно, является неправильным способом сделать это. Matlab даже не предоставляет функцию ftruncate (), которая вам понадобится для сокращения файла после замены текста более коротким фрагментом текста. Просто прочитайте весь файл в массив в памяти, манипулируйте им там, а затем запишите все обратно с помощью fopen (..., 'w'), заменив исходный файл. Если вы делаете линейно-ориентированные изменения, вероятно, будет проще работать с массивом cellstr строк вместо одного большого массива char со встроенными разделителями строк.

2 голосов
/ 28 февраля 2011

Попробуйте открыть файл с помощью 'r+'.'w' просто создаст новый файл и удалит все старое (если оно существует).

f_id=fopen('fire.txt','r+');

...