从文本文件中读取和打印输出

时间:2013-10-07 19:03:58

标签: c text printing

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

1 个答案:

答案 0 :(得分: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);

否则,每次读取正金额时你都会被卡住:总计将>&gt; = 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),然后使用null终止字符串。