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

Strange behaviour in c, fclose(), remove(), rename()

我的程序旨在能够将一行文本附加到 *.txt 文件(通过 fopen(file,"a"))或编辑特定行(通过 fopen(file,"w")

如果我从编辑行开始,我可以编辑任意多行。 但是一旦我第一次添加一行,我就不能再编辑行了。

"edit" 函数(代码如下)将旧文件中的所有行写入新的临时文件。到达我要编辑的行,它将更改的行写入临时文件,并以从旧文件复制其余行结束。在 EOF 我关闭两个文件后,删除旧文件并重命名临时文件。

据我通过调试我的程序得知,editLine() 方法正在正确写入临时文件。它只是不会删除旧文件并重命名临时文件。只要我从不附加一行,它就可以很好地工作。

代码:

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;
}

谁能告诉我为什么程序会这样?我需要改变什么?谢谢...

我有几点建议:

1) 尝试在 fclose()remove() 之间添加延迟,也许 OS 会在文件关闭后阻塞一段时间。

2) 尝试在关闭文件前使用fflush()

实际上在 appendLine() 调用之后对文件进行了 fopen() 调用。 我想我不知何故不小心把它插在那里了。

所以答案是: 由于文件仍处于打开状态,因此无法将其删除或重命名。