c中的奇怪行为,fclose(),remove(),rename()

c中的奇怪行为,fclose(),remove(),rename(),c,file-io,C,File Io,我的程序可以将一行文本附加到*.txt文件(通过fopen(文件,“a”))或编辑特定行(通过fopen(文件,“w”)) 如果我从编辑行开始,我可以编辑任意多的行。 但是,当我第一次添加一行时,我就不能再编辑行了 “编辑”功能(代码如下)将旧文件中的所有行写入新临时文件。到达我要编辑的行时,它将更改的行写入临时文件,并从旧文件复制其余的行。在EOF关闭两个文件后,删除旧文件并重命名临时文件 就我调试程序所知,方法editLine()正确地写入了临时文件。它只是不会删除旧文件并重命名临时文件。只

我的程序可以将一行文本附加到*.txt文件(通过
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;
}