Перезапись в файле с произвольным доступом - PullRequest
3 голосов
/ 15 мая 2011

У меня есть файл произвольного доступа, открытый в режиме «r + b» с записями одинаковой длины. Могу ли я изменить содержимое записи после ее прочтения и перезаписать на месте?

Я попробовал следующий код, но при запуске я получаю: Ошибка сегментации (ядро сброшено)

#include<stdio.h>

int main()
{
   struct tala {
      int rec_no;
      long file_no;
   };
   FILE *file_locking;
   struct tala t,f;
   file_locking = fopen("/path/to/my/file.bin", "rb+");
   t.rec_no = 1;
   t.file_no = 3;
   if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   t.rec_no=0;
   rewind(file_locking);
   if (fwrite(&t, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   rewind(file_locking);
   if (fread(&f, sizeof(struct tala),1,file_locking)==0)
      printf("Error opening file");
   printf("\n %d",f.rec_no);
   printf("\n %ld", f.file_no);
   fclose(file_locking);
}

Ответы [ 2 ]

5 голосов
/ 15 мая 2011

Да, вы можете. Просто не забывайте всегда fseek между чтением и записью.

Цитировать справочную страницу fopen:

Чтение и запись могут быть смешаны в потоках чтения / записи в любом порядке. Обратите внимание, что ANSI C требует, чтобы функция позиционирования файла вмешивалась между выводом и вводом, если только операция ввода не встречает конец файла.

Дополнительный совет: всегда проверяет возвращаемое значение fopen и связанных функций и обрабатывает ошибки (используйте perror или strerror, чтобы распечатать то, что не удалось).

1 голос
/ 15 мая 2011

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

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