开发者

Overwriting lines in file in C

开发者 https://www.devze.com 2022-12-24 09:25 出处:网络
I\'m doing a project on filesystems on a university operating systems course, my C program should simulate a simple filesystem in a human-readable file, so the file should be based on lines, a line wi

I'm doing a project on filesystems on a university operating systems course, my C program should simulate a simple filesystem in a human-readable file, so the file should be based on lines, a line will be a "sector". I've learned, that lines must be of the same length to be overwritten, so I'll pad them with ascii zeroes till the end of the line and leave a certain amount of lines of ascii zeroes that can be filled later.

Now I'm making a test program to see if it works like I want it to, but it doesnt. The critical part of my code:

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(fil开发者_JAVA技巧e)) == '\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);

Now it does nothing, the file stays the same. What could be the problem?

Thank you.


From here,

When a file is opened with a "+" option, you may both read and write on it. However, you may not perform an output operation immediately after an input operation; you must perform an intervening "rewind" or "fseek". Similarly, you may not perform an input operation immediately after an output operation; you must perform an intervening "rewind" or "fseek".

So you've achieved that with fflush, but in order to write to the desired location you need to fseek back. This is how I implemented it - could be better I guess:

 /* 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);

Also, as has been commented, you should check if your file has been opened successfully, i.e. before reading/writing to file, check:

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

精彩评论

暂无评论...
验证码 换一张
取 消