繁体   English   中英

为什么 rename() 和 remove() 函数不起作用?

[英]Why rename() and remove() functions don't work?

如果我单独使用此代码(带有主函数),它就可以工作。

但是当我在我的项目中包含这个函数时,它给出了两个文件:

annuaire_client.txtannuaire1.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 函数打开的描述符。 确保将所有fopenfclose配对,或者即使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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM