在文本文件中读取错误的整数

时间:2017-03-18 22:57:47

标签: c file-io

我需要提出一个程序来读取数字列表并生成值的直方图。这些数字在文本文件中逐行列出。因此,我认为使用fscanf是合适的,因为它在输入空白字符时停止读取。但是,我在fgets或fscanf之间根本不确定。我选择fscanf的另一个原因是因为fscanf只是将读取的数字分配给变量而不是数组。我不需要数组,因为我只想检查用条件读取的每个数字并增加相应的计数器。无论如何,代码无法工作,并且在试图追踪错误时,我打印出它读取的数字,而且我不知道为什么读取的数字与文本文件中的数字不同。预期的执行跟踪是:

1- 9: XXXX
10-19: XXXXXXXXXXXXXXXXXXXX
20-29: XXXXXXXXX

这是我的代码:

#include <stdio.h>

int main ()
{
    FILE *ptr_file;
    int count [10] = {0}, a = 0;

    ptr_file = fopen("histogram-input.txt", "r"); 

    if ( !ptr_file )
    return 1;

    while ( fgetc(ptr_file) != EOF )
    {
        fscanf (ptr_file, "%d", &a);
        printf("%d\n", a);


            if ( a >=1 && a <= 9 )
            {
                count [0] ++;
            }

            else if ( a >= 10 && a <= 19 )
            {
                count [1] ++;
            }

            else if ( a >= 20 && a <= 29 )
            {
                count [2] ++;
            }

            else if ( a >= 30 && a <= 39 )
            {
                count [3] ++;
            }

            else if ( a >= 40 && a <= 49 )
            {
                count [4] ++;
            }

            else if ( a >= 50 && a <= 59 )
            {
                count [5] ++;
            }

            else if ( a >= 60 && a <= 69 )
            {
                count [6] ++;
            }
            else if ( a >= 70 && a <= 79 )
            {
                count [7] ++;
            }

            else if ( a >= 80 && a <= 89 )
            {
                count [8] ++;
            } 

            else if ( a >= 90 && a <= 99 )
            {
                count [9] ++;
            }


    }

    fclose ( ptr_file );

    for ( int k = 0; k < 10; k++ )
    {
        if ( k == 0 )
        {
            printf("1-9: ");

            for ( int h = 1; h <= count [0]; h++ )
            {
                printf("X");
            }
            printf("\n");
        }

        else
        {
            printf("%d-%d: ", k*10, k*10 + 9 );

            for ( int h = 1; h <= count [k]; h++ )
            {
                printf("X");
            }
            printf("\n");
        }

    }

    return 0;
}

我程序的直方图输出中的我的Xs持续了太多次。

这是我执行追踪的一小部分:

12
45
95
72
28
7

我的文本文件中的第一个数字是:

1
57
51
31
68
98
6

我不明白为什么阅读的数字不同。有人可以帮我吗?谢谢!

1 个答案:

答案 0 :(得分:1)

你有两个问题:

  1. 每次while循环重复时,都会执行fgetc()从文件中读取字符,然后执行fscanf()读取整数。 fgetc()会干扰fscanf()

  2. 的正确结果
  3. 在while循环中有一个额外的for循环。这基本上将每个数字计算100次。