Редактирование текстового файла произвольного размера в C/C++

Рейтинг: 0Ответов: 2Опубликовано: 09.05.2011

Например, файл 1.txt содержит информацию "123456789**" Как убрать звёздочки? В конце должно получиться "123456789".

Как правильно редактировать файл 1.txt, не создавая другой файл?

Ответы

▲ 3

Откроем два потока (один чтение, другой запись (на update)) на тот же файл. Переписываем поверх символы не равные '*', потом урезаем файл.

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

main (int ac, char *av[])
{
  if (ac < 2) {
    printf ("No filename\n");
    exit(1);
  }
  int i = 0, c;
  FILE *in = fopen(av[1],"r"), *out = fopen(av[1],"r+");
  if (in == NULL || out == NULL) {
     perror (av[1]);
     exit(2);
  }
  rewind(out);
  while ((c = fgetc(in)) != EOF) {
    if (c != '*') {
      i++;
      fputc(c,out);
    }
  }
  fclose(in);
  ftruncate(fileno(out),i);
  fclose(out);
}
▲ 1

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