Заменить первое вхождение шаблона в файл


Вот моя попытка заменить первое вхождение шаблона в файл с пробелами. Эффективно удаляя его, и, надеюсь, позволит мне "удалить" это в большой файл, не переписывая его.

#define MAX_LINE_LENGTH
int removeFirstOccurenceInFile(const char* fileName, const char* pattern) {
  FILE* f = fopen(fileName,"r+");
  if (f == NULL) {
     perror("Can't open input file");
     return 0;
  }
  char buf[MAX_LINE_LENGTH] = {'\0'};
  char spaces[MAX_LINE_LENGTH];

  int unreadBytes = 0;
  char* patInBuf = NULL;
  while (1) {
    if (patInBuf != NULL) break;
    unreadBytes += strlen(buf);
    if (fgets(buf,sizeof(buf),f) == NULL) break;
    patInBuf = strstr(buf,pattern);
  }
  if (patInBuf == NULL) {
    fprintf(stderr,"No '%s' found in '%s'\n",pattern,fileName);
    fclose(f);
    return 0;
  }
  int delFrom = patInBuf-buf;

  memset(spaces,' ',delFrom);
  fseek(f,unreadBytes+delFrom, SEEK_SET);
  fwrite(spaces,1,strlen(pattern),f);

  fclose(f);
  return 1;
}

Я не уверен насчет обработки ошибок. Я считал, используя Гото вместо обычной обработки ошибок:

  if (patInBuf == NULL) {
    fprintf(stderr,"No '%s' found in '%s'\n",pattern,fileName);
    retval = -1;
    goto cleanup;
  }
...
cleanup:
  fclose(f);
  return retval;

Есть ли другие проблемы? Это действительно быть эффективным?



163
2
задан 30 ноября 2011 в 09:11 Источник Поделиться
Комментарии
1 ответ

Я бы посоветовал отказаться от идеи лечения как текстовый файл для того, чтобы осуществить поиск по ней, но потом как двоичный файл для записи в него. Расчет смещения стремиться надуманные, и гарантированно не сработает, если файл имеет не одного символа конца строки метки, (если в Unix, а CR+LF в окна,) если она начинается с Юникод спецификации, или если она содержит любой кодировке utf8 символов.

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

1
ответ дан 30 ноября 2011 в 07:11 Источник Поделиться