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

时间:2015-02-05 07:57:29

标签: c file-io

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

如果我从编辑行开始,我可以编辑尽可能多的行。 但是,当我第一次添加一行时,我就无法再编辑行了。

"编辑" function(代码跟随)将旧文件中的所有行写入新的临时文件。到达我想要编辑的行,它将更改的行写入临时文件,最后复制旧文件中的其余行。在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;
}

有谁可以告诉我为什么程序会像那样?我需要改变什么?谢谢......

2 个答案:

答案 0 :(得分:1)

实际上fopen()电话后,文件上有appendLine()次呼叫。 我想我不小心把它插在了那里。

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

答案 1 :(得分:0)

我有一些建议:

1)尝试在fclose()remove()之间添加延迟,也许操作系统会在关闭后阻止该文件一段时间。

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