[英]Why rename() and remove() functions don't work?
如果我单独使用此代码(带有主函数),它就可以工作。
但是当我在我的项目中包含这个函数时,它给出了两个文件:
annuaire_client.txt
和annuaire1.txt
使用的代码如下:
void delete_client(){
FILE *annuaire_client,*annuaire1;
printf("\t\t\t\t\t\t\t\tNum de compte a supprimee: ");
int delete_line;
scanf("%d",&delete_line);
char ch;
int line = 1;
//ouvrir le fichier original
annuaire_client = fopen("annuaire_client.txt", "r");
ch = getc(annuaire_client);
//retour au debut
rewind(annuaire_client);
//ouvrir nouveau fichier
annuaire1 = fopen("annuaire1.txt", "w");
while (ch != EOF)
{
if (ch == '\n')
{
line++;
}
//sautez la line a supprimer
if (line != delete_line)
{
//copier les lines vers annuaire1.txt
fprintf(annuaire1,"%c",ch);
}
ch = getc(annuaire_client);
}
fclose(annuaire1);
fclose(annuaire_client);
remove("annuaire_client.txt");
rename("annuaire1.txt","annuaire_client.txt");
}
您应该检查 remove 和 rename 的返回值:
if (remove("annuaire_client.txt") != 0) {
/* handle error */
}
if (rename("annuaire1.txt","annuaire_client.txt") == -1) {
/* handle error */
}
许多可能性之一是您在调用 remove 时保持由 main 函数打开的描述符。 确保将所有fopen
与fclose
配对,或者即使unlink
/ remove
路径,您的进程仍将保持(已删除)描述符打开,如果达到为其分配的描述符限制,这可能会导致致命错误( fopen
将失败 - 这已经发生了我今天,所以这不是纯人为的情况)。 还要记住,在无效指针上调用fclose
是未定义的行为,即不是FILE*
,特别是在 NULL 上。
您可以尝试检查函数的结果代码。 例如,对于rename
功能,您可以使用一些代码,例如:
#include <errno.h>
(……)
int ret;
ret = rename("annuaire1.txt", "annuaire_client.txt");
if(ret == 0)
{
printf("File renamed successfully");
}
else
{
printf("Error: unable to rename the file");
fprintf(stderr, "System error (%d): %s\n", errno, strerror(errno);
}
尝试在 remove 函数中写入文件的完整路径,并在 rename 函数中写入新名称。 例如:
remove("C:\\Documents\\annuaire_client.txt");
rename("anuuaire1.txt","C:\\Documents\\annuaire_client.txt");
请记住使用 \\\\ 而不是 \\
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.