1

我必须制作一个用 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
4

1 回答 1

0

在情况 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) 代替,然后以空值终止字符串。

于 2013-10-07T19:48:26.413 回答