2016-06-21 210 views
0

如果我单独使用此代码(使用主函数),它可以工作。为什么rename()和remove()函数不起作用?

但是,当我在自己的项目这一功能,它给出了两个文件:

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"); 
} 
+0

张贴代码缺少几个关键项目:1)'的#include '2)经常检查(= NULL )从'fopen()'返回的值确保操作成功3)始终检查(== 0)从'rename()'返回的值以确保操作成功。 4)总是检查(== 0)从remove()返回的值以确保操作成功。任何时候系统函数返回的值都表示函数失败,调用:'perror()',因为它会输出任何附带的文本字符串+操作系统认为是函数调用失败的错误信息。 – user3629249

回答

1

您应该检查返回值的删除和重命名:

if (remove("annuaire_client.txt") != 0) { 
     /* handle error */ 
    } 
    if (rename("annuaire1.txt","annuaire_client.txt") == -1) { 
     /* handle error */ 
    } 

许多可能性之一是,在调用remove时,通过main函数保持描述符打开。确保将所有fopenfclose配对,或者即使您的unlink/路径仍然保持(删除)描述符打开,如果达到为其分配的描述符限制,可能会导致严重错误(fopen将失败 - 这种情况已发生我今天,所以它不是纯粹的人为情况)。还请记住,在无效指针上调用fclose是未定义的行为,尤其是在空值上不是FILE*

+0

谢谢你们 你能为我改写整个代码吗?即时通讯初学者,我没有得到你的大部分点你能给我正确的代码,我必须合并到我的项目? –

+0

@YoussefAzougagh这是可能的,但它不会对你有什么好处,因为你真的需要了解每一条线。对您而言,更好的选择是针对您不明白的事情提出具体问题。 – 4pie0

1

您可以尝试检查您的功能的结果代码。 例如,对于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); 
    } 
+0

使用建议的方法导致:1)错误消息在'stdout'而不是'stderr'上输出2)必须通过'#include '包含一个额外的头文件。建议使用'perror()'作为错误消息或使用:'fprintf(stderr,“formatstring \ n”,parameters)'其中的一个参数应该是'strerror(errno)' – user3629249

+0

我照你的建议 –

0

试着写的删除功能,并在新名称的文件的完整路径在重命名功能。 例如:

remove("C:\\Documents\\annuaire_client.txt"); 
rename("anuuaire1.txt","C:\\Documents\\annuaire_client.txt"); 

记住使用的\\而不是\

相关问题