【问题标题】:Reading and printout from a text file从文本文件中读取和打印输出
【发布时间】:2013-10-07 19:03:58
【问题描述】:

我必须编写一个用 C 语言编写的程序,它可以读取并打印出文本文件中的一些内容。

但以下程序的 2 个功能由于某种原因无法正常工作。案例 3 工作正常。但另外 2 个不打印任何内容或仅打印 1 个名称。这怎么可能,我该如何解决。

顺便说一句,我没有收到任何错误。

#include <stdio.h>

main()
{
  FILE *list;
  int number, menu, total;
  char name[20];

  list = fopen("C:\\PATH\\TO\\FILE", "r");

  printf("Menu: \n"\n);
  printf("[1] Positive total: \n");
  printf("[2] Negative total: \n");
  printf("[3] Total: \n");
  printf("[4] Quit \n\n");
  printf("Choose: 1,2,3 or 4:\n");
  scanf("%d", &menu);

 while (menu!=4)
 {
        fscanf(list, "%d%s%d", &number, name, &total);
        switch(menu)
        {
                    case 1: printf("Negative total \n");
                            while(!feof(list))
                            {
                                if (total<0)
                                {
                                      printf("-%6d%-15s%6d\n", number, name , total);
                                      fscanf(list, "%d%s%d", &number, name, &total);
                                }
                            }
                            break;

                    case 2: printf("Positive: \n");
                            while(!feof(list))
                            {
                                if (total>=0)
                                {
                                      printf("-%6d%15s%6d\n", number, name , total);
                                      fscanf(list, "%d%s%d", &number, name, &total);
                                }
                            }
                            break;

                    case 3: printf("Total: \n");
                            while(!feof(list))
                            {
                                printf("-%6d%15s%6d\n", number, name , total);
                                fscanf(list, "%d%s%d", &number, name, &total);
                            }
                            break;
        }

        rewind(list);
        printf("\nChoose again, 1, 2, 3, 4: ");
        scanf("%d", &menu);
        }
        printf("End of Program");
        fclose(list);

        return 0;
}

文本文件包含数字、姓名、他们拥有的总金额(您可以将其视为银行系统)。这是文本文件:

5892 John +7250
5893 Kate -94
5894 Mike +324
5895 Jack +9570
5896 Anne +800

【问题讨论】:

    标签: c text printing


    【解决方案1】:

    在情况 1 和 2 中都有一个无限循环条件。在情况 1 中,这样:

    if (total<0)
    {
        printf("-%6d%-15s%6d\n", number, name , total);
        fscanf(list, "%d%s%d", &number, name, &total);
    }
    

    应该改为:

    if (total<0)
    {
          printf("-%6d%15s%6d\n", number, name , total);
    }
    fscanf(list, "%d%s%d", &number, name, &total);
    

    否则,每次读取正数时都会卡住:total 将 >= 0,因此您不会进入 if 块,也不会执行 fscanf() 调用以继续读取文件。循环期望到达文件的末尾,但您永远不会到达它,因为您没有向前阅读,您只是停止了。

    情况 2 也是如此:您必须在 if 块之外调用 scanf,如下所示:

    if (total>=0)
    {
          printf("-%6d%15s%6d\n", number, name , total);
    }
    fscanf(list, "%d%s%d", &number, name, &total);
    

    另外,您发布的代码在第 11 行无法编译(您有 printf("Menu: \n"\n),即字符串中有换行符。请尝试在将来提供可编译的代码.

    这是一个工作版本:

    #include <stdio.h>
    
    int main()
    {
      FILE *list;
      int number, menu, total;
      char name[20];
    
      list = fopen("example", "r");
    
      printf("Menu: \n\n");
      printf("[1] Positive total: \n");
      printf("[2] Negative total: \n");
      printf("[3] Total: \n");
      printf("[4] Quit \n\n");
      printf("Choose: 1,2,3 or 4:\n");
      scanf("%d", &menu);
    
     while (menu!=4)
     {
            fscanf(list, "%d%s%d", &number, name, &total);
            switch(menu)
            {
                        case 1: printf("Negative total \n");
                                while(!feof(list))
                                {
                                    if (total<0)
                                    {
                                          printf("-%6d%15s%6d\n", number, name , total);
                                    }
                                    fscanf(list, "%d%s%d", &number, name, &total);
                                }
                                break;
    
                        case 2: printf("Positive: \n");
                                while(!feof(list))
                                {
                                    if (total>=0)
                                    {
                                          printf("-%6d%15s%6d\n", number, name , total);
                                    }
                                    fscanf(list, "%d%s%d", &number, name, &total);
                                }
                                break;
    
                        case 3: printf("Total: \n");
                                while(!feof(list))
                                {
                                    printf("-%6d%15s%6d\n", number, name , total);
                                    fscanf(list, "%d%s%d", &number, name, &total);
                                }
                                break;
            }
    
            rewind(list);
            printf("\nChoose again, 1, 2, 3, 4: ");
            scanf("%d", &menu);
            }
            printf("End of Program");
            fclose(list);
    
            return 0;
    }
    

    最后几点说明:我会测试 fopen() 的返回值以确保文件已成功打开。您可能还想在循环条件下使用 ferror() 执行一些错误检查。最后,确保你的“名字”缓冲区足够大,20 个字符不是很大。对于安全的程序,您应该使用 fgets(name, 19, stdin) 代替,然后以空值终止字符串。

    【讨论】:

    • 另请注意,像这样使用feof() 可能会导致最后一行被重复,因为当您读取文件的最后一个字节时没有设置 EOF 条件,但是当您尝试读取之后那个字节...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    相关资源
    最近更新 更多