用C覆盖文件中的行

时间:2010-03-24 19:08:57

标签: c file line overwrite

我正在大学操作系统课程上对文件系统做一个项目,我的C程序应该在人类可读的文件中模拟一个简单的文件系统,所以文件应该基于行,一行将是一个“扇区” 。我已经知道,行必须具有相同的长度才能被覆盖,因此我将用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 个答案:

答案 0 :(得分:6)

来自here

  

用“+”打开文件时   选项,你可以阅读和写   它。但是,您可能无法执行   一个输出操作后立即   输入操作;你必须执行   介入“倒带”或“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);
}