我正在大学操作系统课程上对文件系统做一个项目,我的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);
现在它什么也没做,文件保持不变。可能是什么问题?
谢谢。
答案 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);
}