Как вставить и удалить некоторые символы в середине файла? - PullRequest
6 голосов
/ 12 марта 2010

Я хочу вставить и удалить некоторые символы в середине файла.

fopen () и fdopen () просто позволяют добавлять в конце.

Есть ли какой-нибудь простой метод или существующая библиотека, которая позволяет эти действия?

Ответы [ 4 ]

7 голосов
/ 12 марта 2010

Как уже говорили другие, вы должны сделать это вручную и использовать fseek, чтобы добраться до места, в которое вам нужно вставить или добавить символы. Вы можете легко добавить новых персонажей посередине, выполнив следующие действия:

  1. Перейти к последнему байту файла и сохранить старый размер файла.
  2. Перейдите туда, куда вы хотите вставить новые символы (скажем, это позиция): fread (старый размер файла - позиция) байтов, и сохраните их в буфере.
  3. fseek для позиционирования снова.
  4. напиши свои новые символы.
  5. Запишите ранее прочитанный буфер.

Если вы хотите удалить символы посередине, то это сложнее. На самом деле вы не можете сделать файл короче. У вас есть две возможности: в первой вы просто

  1. открыть файл и прочитать файл, пропустив символы, которые вы хотите удалить, и сохранить их в буфере
  2. Закройте и снова откройте файл, нажав «b», поэтому его содержимое будет стерто,
  3. Запишите буфер и закройте файл.

Во второй возможности вы:

  1. Считывание в буфер символов перед теми, которые вы хотите удалить.
  2. поиск начала символов, которые вы хотите удалить
  3. написать буфер.
  4. Обрезать остальную часть файла.

Четвертый пункт «хитрый», потому что не существует стандартного (портативного) способа сделать это. Одна возможность - использовать системные вызовы операционной системы для усечения файла. Другая, более простая возможность - просто записать EOF в пункте 4. Файл, вероятно, будет больше, чем должен быть, но сработает.

7 голосов
/ 12 марта 2010

Простого метода не существует. Вы должны сделать это вручную. Например:

  1. Чтение фрагмента, который вы хотите вставить ранее в память
  2. Искать вперед на новую позицию
  3. Напишите только что прочитанный фрагмент на новой позиции
  4. Обратитесь туда, куда вы хотите вставить
  5. Введите новые данные.
3 голосов
/ 12 марта 2010

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

1 голос
/ 25 февраля 2015

Принимая во внимание то, что опубликовал Baltasarq, я написал следующие строки. Вам нужно знать позицию, в которую вы хотите вставить символы

long Fin;
long lSize;
fseek(fd, 0L, SEEK_END);
Fin = ftell(fd);//I get the old file size
fseek(fd, position, SEEK_SET);//you should have declared and initialized "position"
char * buffer;
lSize = Fin - position;//lenght from where you want to insert the chars and the eof

buffer = (char*) malloc(sizeof(char) * lSize);
size_t result = fread(buffer, 1, lSize, fd);//fread (Fin - position) into buffer
fseek(fd, position, SEEK_SET);//fseek to position

fputs(word, fd);//you should know what you want to write (word) and it is a char pointer
fputs(buffer, fd);//fwrite the buffer

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

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