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()
调用。
我想我不知何故不小心把它插在那里了。
所以答案是:
由于文件仍处于打开状态,因此无法将其删除或重命名。
我的程序旨在能够将一行文本附加到 *.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()
调用。
我想我不知何故不小心把它插在那里了。
所以答案是: 由于文件仍处于打开状态,因此无法将其删除或重命名。