【问题标题】:How can I read a file content multiple times in C如何在C中多次读取文件内容
【发布时间】:2019-08-16 20:25:41
【问题描述】:

我正在尝试在 C 中创建一个简单的待办事项列表,但读取选项仅在第一次运行时显示正确的信息。如果我添加一个新项目,那么我需要关闭并再次打开程序以显示更新的列表。

添加选项工作正常,删除选项尚未实现。

#include <stdio.h>

int main (void) {
    int opt = 1;
    char task[50];
    char add[50];
    char read;
    FILE *p, *q;

    printf("\n===To-do List Simple Application===\n");
    printf("Choose an Option:\n");
    do {
        printf("1- Show List\n");
        printf("2- Add an item\n");
        printf("3- Delete an item\n");
        printf("0- Exit\n");
        scanf("%d" ,&opt);
        switch(opt){
        case 1:
            q = fopen("list.txt", "r");
            printf("\n\n==================\n");
            read = fgetc(q);
            while (read != EOF){
                printf("%c" ,read);
                read = fgetc(q);
            }
            printf("%s \n", task);
            printf("\n==================\n\n");
            break;

        case 2:
            p = fopen("list.txt", "a");
            printf("\n\n==================\n");
            printf("Inform the item to be added:\n");
            scanf("%s" ,add);
            fprintf(p, "\n%s",add);
            printf("\n==================\n\n");
            break;

        case 3:
            printf("\n\n==================\n");
            printf("delete\n");
            printf("\n==================\n\n");
            break;

        case 0: 
            printf("\n\n==================\n");
            printf("exit\n");
            printf("\n==================\n\n");
            break;
        }   
    }while (opt!=0);
    return 0;
}

【问题讨论】:

  • 你可以使用fseek()回到文件的开头再读一遍。
  • 添加文件后需要关闭文件或调用fflush(),刷新输出缓冲区。
  • 还要注意fgetc()返回int,而不是char,因为EOF是一个不能用char值表示的值。

标签: c file read-write fgetc


【解决方案1】:

您可以使用fseek(file, 0, SEEK_SET)rewind(file) 再次开始读取/写入文件开头。

请注意,如果您以附加模式打开文件,则这些基本上不会做任何事情;所有写入仍将被强制到文件末尾。

但是,这些不会修复您的代码。完成写入或读取文件后,您需要关闭文件。

除此之外,您还在使用未初始化的task。初始化它或检查它是否已初始化,然后再开始使用它来解决此问题。

【讨论】:

    【解决方案2】:

    问题是您在写入文件后没有关闭文件。这将刷新输出缓冲区。程序退出时文件会自动关闭,这就是为什么重新打开程序可以解决问题。

    您还应该在阅读案例结束时关闭文件,因为您每次阅读时都会重新打开它,而不是重用现有的打开流。

    打印task 会导致未定义的行为,因为您从未初始化task

    #include <stdio.h>
    
    int main (void) {
        int opt = 1;
        char task[50];
        char add[50];
        char read;
        FILE *p, *q;
    
        printf("\n===To-do List Simple Application===\n");
        printf("Choose an Option:\n");
        do {
            printf("1- Show List\n");
            printf("2- Add an item\n");
            printf("3- Delete an item\n");
            printf("0- Exit\n");
            scanf("%d" ,&opt);
            switch(opt){
            case 1:
                q = fopen("list.txt", "r");
                printf("\n\n==================\n");
                read = fgetc(q);
                while (read != EOF){
                    printf("%c" ,read);
                    read = fgetc(q);
                }
                fclose(q);
                // printf("%s \n", task);
                printf("\n==================\n\n");
                break;
    
            case 2:
                p = fopen("list.txt", "a");
                printf("\n\n==================\n");
                printf("Inform the item to be added:\n");
                scanf("%s" ,add);
                fprintf(p, "\n%s",add);
                fclose(p);
                printf("\n==================\n\n");
                break;
    
            case 3:
                printf("\n\n==================\n");
                printf("delete\n");
                printf("\n==================\n\n");
                break;
    
            case 0: 
                printf("\n\n==================\n");
                printf("exit\n");
                printf("\n==================\n\n");
                break;
            }   
        }while (opt!=0);
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-26
      • 2012-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多