C中文件的最大和最小数量

时间:2015-03-15 17:59:00

标签: c file

我有一个文件,其中包含以空格分隔的数字并输入。我想找到最大值和最小值:

#include <stdio.h>
#include <conio.h>
int main()
{
    char nums[500];
    int min,max,i,a;
    FILE * file;
    file = fopen ("test.txt", "r");
    i=0;
    while( fscanf(file, "%d,", &a) > 0 )
    {
        nums[i++] = a;
    }



    for(i=0; i<=sizeof(nums); i++){

          if (nums[i]>max) max=nums[i];
          if (nums[i]<min) min=nums[i];

        }
    printf("Maximum: %d\n", max);
    printf("Minimum: %d", min);

    fclose (file);
    getch();
}

我总是得到:

Maximum: 2686820 
Minimum: -128

好的,所以我将char nums[500]更改为int nums[500]。我初始化了max=0min=INT_MAX(使用<limits.h>)。 它仍然给我一个随机值。

如果数字形成文件更改,我将如何前进?有没有一种方法来初始化一个数组与文件内的数字的特定长度?

6 个答案:

答案 0 :(得分:4)

您没有初始化minmax变量。未初始化的非静态局部变量(如minmax变量)具有不确定值,实际上它们看似随机。在没有初始化的情况下使用它们会导致undefined behavior

您也没有初始化所有数组,这意味着您未初始化的值 也具有不确定的值。

为了增加对伤害的侮辱,你也超越了阵列的范围,这也导致了未定义的行为。

哦,如果您从文件中读取的值大于char中的值,则会被截断。

答案 1 :(得分:2)

此外,您在int数组中存储从文件中读取的char值,因此精度会降低。

答案 2 :(得分:1)

你盲目地认为该文件包含不超过500个数字 - 这是正确的吗? 你盲目地假设文件中的数字符合char范围 - 这是正确的吗?

然后for循环中的sizeof(nums)总是返回500,那么如果文件实际包含的数字少于500,会发生什么?您访问尚未初始化或包含垃圾的内存。

然后你不初始化min和max,它们也用当时在内存中找到的值初始化。

(噢,我没有看到其他答案的暗示......)

答案 3 :(得分:0)

除了其他帖子之外,这是解决问题的解决方案(应该添加一点错误,检查来自fscanf的返回值

int min,max,i,a;
FILE * file;
file = fopen ("test.txt", "r");
fscanf(file, "%d,", &a);

min = max = a;
while( fscanf(file, "%d,", &a) > 0 )
{
    if (min > a) min = a;
    if (max < a) max = a;
}

答案 4 :(得分:0)

此外,你提到了

  

包含数字的文件,以空格分隔并输入

所以,你必须写fscanf(file, "%d", &a);而不是fscanf(file, "%d,", &a);

这意味着你必须用格式化字符串中的空格替换逗号。

答案 5 :(得分:0)

the following code corrects the problems, 
compiles cleanly, 
demonstrates a proper error handling technique
eliminates the portability problem
eliminates unneeded variables
because a space is part of the 'white space' definition and 
the %d input conversion format specifier skips over white space,  
so no extra spacing in the scanf format string.



#include <stdio.h>
#include <stdlib.h> // exit(), EXIT_FAILURE
#include <limits.h> // INT_MAX, INT_MIN

int main()
{
    int min = INT_MAX;
    int max = INT_MIN;
    int a; // current value read from file

    FILE * file = NULL;
    if( NULL == (file = fopen ("test.txt", "r") ) )
    { // then, fopen failed
        perror( "fopen for test.txt failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, fopen successful

    while( fscanf(file, "%d", &a) )
    {
        if( a < min ) min = a;
        if( a > max ) max = a;
    } // end while

    printf("Maximum: %d\n", max);
    printf("Minimum: %d\n", min); // '\n' causes output to terminal

    fclose (file);
    getchar();
    return( 0 );
} // end function: main