Перезапись строк в файле на С - PullRequest
2 голосов
/ 24 марта 2010

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

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

file = fopen("irasproba_tesztfajl.txt", "r+"); //it is previously loaded with 10 copies of the line I'll print later in reverse order  

  /* this finds the 3rd line */
 int count = 0; //how much have we gone yet?
 char c;

 while(count != 2) {
  if((c = fgetc(file)) == '\n') count++;
 }

 fflush(file);

 fprintf(file, "- . , M N B V C X Y Í Ű Á É L K J H G F D S A Ú Ő P O I U Z T R E W Q Ó Ü Ö 9 8 7 6 5 4 3 2 1 0\n");

 fflush(file);

 fclose(file);

Теперь ничего не происходит, файл остается прежним. В чем может быть проблема?

Спасибо.

1 Ответ

6 голосов
/ 24 марта 2010

С здесь ,

Когда файл открывается с "+" вариант, вы можете читать и писать на Это. Тем не менее, вы не можете выполнять выходная операция сразу после операция ввода; Вы должны выполнить промежуточный «перемотка» или «fseek». Точно так же вы не можете выполнять операция ввода сразу после выходная операция; Вы должны выполнить промежуточный «перемотка» или «fseek».

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

 /* this finds the 3rd line */
 int count = 0; //how much have we gone yet?
 char c;
 int position_in_file;

 while(count != 2) {
  if((c = fgetc(file)) == '\n') count++;
 }

 // Store the position
 position_in_file = ftell(file);
 // Reposition it
 fseek(file,position_in_file,SEEK_SET); // Or fseek(file,ftell(file),SEEK_SET);

 fprintf(file, "- . , M N B V C X Y Í Ű Á É L K J H G F D S A Ú Ő P O I U Z T R E W Q Ó Ü Ö 9 8 7 6 5 4 3 2 1 0\n");  
 fclose(file);

Кроме того, как уже отмечалось, вы должны проверить, был ли ваш файл успешно открыт, то есть перед чтением / записью в file, проверьте:

file = fopen("irasproba_tesztfajl.txt", "r+");
if(file == NULL)
{
  printf("Unable to open file!");
  exit(1);
}
...