remove 函数不起作用,直到我添加带有 true 和 false 的 if 语句

remove function doesnt work until I add if statement with true and false

提问人:melodic_n 提问时间:9/15/2023 最后编辑:chqrliemelodic_n 更新时间:9/15/2023 访问量:92

问:

我正在为学校做一个项目,一个学生管理系统,其中两个功能是删除学生和修改学生信息:在这两个文件中,我都创建了一个临时文件来存储新的更新版本,然后我删除了原始文件并将临时文件重命名为旧文件,但是该功能不起作用,直到我分配一个像这样的布尔变量,然后添加一个打印成功修改的语句/如果为 true,则删除,如果为 false,则不删除/修改,并且只有在我添加此语句并且我感到困惑时才有效。为什么会这样?removert = remove("studentDB.txt");if

void deletestudent(FILE *fp) {

    system("cls");
    fp = fopen("studentDB.txt", "r");
    FILE *ft = fopen("database.tmp", "w");
    bool rt;
    int line, count;
    char buffer[100];
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\n");
    printf("\t\t\t 2. Delete a Student \n");
    printf("\t\t---------------------------------------------------------\t\t\t\t\t\t");
    printf("\n");
    printf("\t\t\t ");
    printf("select student id \n");
    printf("\t\t\t ");
    scanf("%d", &line);
    count = 0;
    while ((fgets(buffer, 1000, fp)) != NULL)
    {
        count++;// so that the counting start at 1

        /* If current line is line to replace */
        if (count == line) {
            fputs("", ft);
        } else
            fputs(buffer, ft);
    }
    fclose(fp);
    fclose(ft);
    rt = remove("studentDB.txt");
    rename("database.tmp", "studentDB.txt");
    if (rt == TRUE)
        printf("not successfull");
    printf("\t\t\t\t");
    printf("deleted successfully  \n");
    system("pause");
}

我真的很困惑为什么它有效

C 函数

评论

1赞 Some programmer dude 9/15/2023
请尝试创建一个最小的可重复示例来展示我们。强调最小的部分。
2赞 Weather Vane 9/15/2023
请出示不起作用的代码。
2赞 Some programmer dude 9/15/2023
请花一些时间阅读有关删除及其真正返回的内容的更多信息。不能保证在失败时返回特定的非零值。TRUE
2赞 nmnir 9/15/2023
我看到的一件事是缓冲区被初始化为大小为 100,但您读取了 1000。
2赞 chux - Reinstate Monica 9/15/2023
@melodic_n,最好是fgets(buffer, 1000, fp)fgets(buffer, sizeof buffer, fp)

答:

3赞 chqrlie 9/15/2023 #1

在复制循环期间,将行读入长度为 的数组中。如果输入文件中的任何一行超过 99 个字节,则表示行为未定义,这可能会导致不同的观察结果,具体取决于您添加的额外代码。fgets(buffer, 1000, fp)buffer100

使用不易出错的方法:

    while ((fgets(buffer, sizeof buffer, fp)) != NULL)

另请注意以下备注:

  • 检查故障并使用信息性消息报告它们非常重要。fopen

  • fputs("", ft);是无用的,没有效果。

  • 在符合 POSIX 标准的系统上,调用是不必要的,因为调用将删除目标文件并执行重命名,以确保名称为 studentDB.txt 的文件始终存在,并以原子方式替换为新文件。您似乎正在使用 Microsoft Windows 系统,其行为可能有所不同。removerename("database.tmp", "studentDB.txt")

在所有情况下,最好测试并报告重命名新文件失败,并确保旧文件在失败时仍然存在。

评论

0赞 melodic_n 9/16/2023
当我删除 remove() 时,临时文件没有更改名称
1赞 chqrlie 9/17/2023
@melodic_n:您可能正在 Microsoft Windows 上运行测试,但 Windows 不支持此行为。
0赞 melodic_n 9/22/2023
这让我发疯了,但我想这就是发生的事情,我尝试了 evrything