c中的奇怪行为,fclose(),remove(),rename()
我的程序可以将一行文本附加到*.txt文件(通过c中的奇怪行为,fclose(),remove(),rename(),c,file-io,C,File Io,我的程序可以将一行文本附加到*.txt文件(通过fopen(文件,“a”))或编辑特定行(通过fopen(文件,“w”)) 如果我从编辑行开始,我可以编辑任意多的行。 但是,当我第一次添加一行时,我就不能再编辑行了 “编辑”功能(代码如下)将旧文件中的所有行写入新临时文件。到达我要编辑的行时,它将更改的行写入临时文件,并从旧文件复制其余的行。在EOF关闭两个文件后,删除旧文件并重命名临时文件 就我调试程序所知,方法editLine()正确地写入了临时文件。它只是不会删除旧文件并重命名临时文件。只
fopen(文件,“a”)
)或编辑特定行(通过fopen(文件,“w”)
)
如果我从编辑行开始,我可以编辑任意多的行。
但是,当我第一次添加一行时,我就不能再编辑行了
“编辑”功能(代码如下)将旧文件中的所有行写入新临时文件。到达我要编辑的行时,它将更改的行写入临时文件,并从旧文件复制其余的行。在EOF关闭两个文件后,删除旧文件并重命名临时文件
就我调试程序所知,方法editLine()
正确地写入了临时文件。它只是不会删除旧文件并重命名临时文件。只要我不加一行,它就可以很好地工作
代码:
有人能告诉我为什么程序会这样吗?我必须改变什么?Thx…我有一些建议: 1) 尝试在
fclose()
和remove()
之间添加延迟,可能操作系统会在关闭文件后阻塞文件一段时间
2) 在关闭文件之前尝试使用
fflush()
。实际上在appendLine()
调用之后,文件上有一个fopen()
调用。
我想我不小心把它插到了那里
所以答案是:
由于文件仍处于打开状态,因此无法删除或重命名。请在使用返回的指针之前检查
fopen()
是否成功。是否在其他地方打开了DATAFILE
?检查remove
和rename
的返回值,如果返回失败(返回-1
),然后检查errno
的错误。到目前为止,我还没有检查返回值。。。我现在就去做。但是如上所述,读写操作正如预期的那样正常工作。只有remove()
和rename()
函数不再工作。如果例如remove
失败,它将返回-1
,首先检查是否存在此问题。如果失败,您可以通过两种方式打印错误:使用或使用。这两个链接都包含有关如何使用函数的示例。重要提示:除非上一个函数实际失败,否则不要使用(直接或间接通过例如peror
),除非函数实际失败,errno
的值未定义。如果editLine
被getChanges
或mystruct\u write
调用,然后您已经在该文件上打开了一个文件指针。我无法理解为什么不检查文件api调用的成功/失败。在中查看所有相关的代码会很有帮助。
void editLine(int line)
{
FILE *fin, *fout;
mystruct a;
int i = 1;
fin = fopen(DATAFILE,"r"); //"r" -> read
fout = fopen(TEMPFILE,"w"); //"w" -> write
while(mystruct_read(&a, fin)!=EOF)
{
if (line==i) getChanges(&a);
mystruct_write(&a,fout);
i++;
}
fclose(fin);
fclose(fout);
remove(DATAFILE);
rename(TEMPFILE, DATAFILE);
return;
}
void appendLine()
{
FILE *file;
mystruct a = {0};
file = fopen(DATAFILE,"a");
getChanges(&a);
mystruct_write(&a,file);
fclose(file);
return;
}