“如何从C中的文件中查找2D数组中的最大值”

时间:2019-05-05 05:44:37

标签: c

我正在使用C语言编写一个程序,该程序使用文件中的数据初始化2D数组,读取数据后,我需要在2D数组中找到最大的数字并打印其值和索引。

我已成功将文件读入数组并显示了它。但是我无法获得数组的最大值。我当前的代码将最大值实际为12时输出为434

我正在读取的文件称为 info.txt ,其中包含整数: 12, 31, 35, 23, 5, 43, 434, 63, 64。它以3x3矩阵格式显示在文件中。

任何形式的帮助将不胜感激。先感谢您。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int arrayData[3][3];
    FILE *input;
    int i, j, max;

    // Open the file
    input = fopen("info.txt", "r");

    // Read the data from the file into arrayData
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            fscanf(input, "%d\n", &arrayData[i][j]);
        }
    }

    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            printf("%d ", arrayData[i][j]); //display the data
        }
        printf("\n");
    }

    fclose(input);

    // Find the largest value, print it, and it’s indices
    max = arrayData[0][0];

    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            if (max < arrayData[i][j])
                max = arrayData[i][j];
        }
    }

    printf("The largest value in the array is: %d\n", max);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

您的代码和问题描述中有一些问题:

  • 始终检查fopen是否成功打开文件。
  • 语句fscanf(input, "%d\n", &arrayData[i][j]);在转换数字后将无用地扫描非空白字节。从格式字符串中删除结尾的\n
  • 始终测试fscanf()的返回值和类似的函数以检测无效或丢失的输入。就您而言,它应该返回1。如果文件中包含意外内容,例如问题文本中的逗号,则将无法正确初始化数组,并且行为未定义。
  • 显示文件内容,而不仅仅是描述文件。每个字节都很重要。

这是您的代码的更正版本:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ROWS  3
#define COLS  3

int main() {
    int arrayData[ROWS][COLS];
    FILE *input;
    int i, j, max, max_i, max_j;

    // Open the file
    input = fopen("info.txt", "r");
    if (input == NULL) {
        fprintf(stderr, "cannot open file: %s\n", strerror(errno));
        return 1;
    }

    // Read the data from the file into arrayData
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            if (fscanf(input, "%d", &arrayData[i][j]) != 1) {
                fprintf(stderr, "invalid input for arrayData[%d][%d]\n", i, j);
                fclose(input);
                return 1;
            }
        }
    }
    fclose(input);

    // Display the matrix data
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            printf("%d ", arrayData[i][j]);
        }
        printf("\n");
    }

    // Find the largest value, print it, and it’s indices
    max = arrayData[max_i = 0][max_j = 0];
    for (i = 0; i < ROWS; i++) {
        for (j = 0; j < COLS; j++) {
            if (max < arrayData[i][j])
                max = arrayData[max_i = i][max_j = j];
        }
    }

    printf("The largest value in the array is %d at arrayData[%d][%d]\n",
           max, max_i, max_j);
    return 0;
}

答案 1 :(得分:-2)

实际上,您不需要将其迭代为N维数组,因为数组是连续的内存块。

int maxinarray(int *array, size_t size)
{
    int max = *array++;
    while(--size)
    {
        if(max < *array)
        {
            max = *array;
        }
        array++;
    }
    return max;
}

#define ROWS 3 
#define COLS 3 

int main()
{
    int testarray[ROWS][COLS] = {{12, 31, 35}, {23, 5, 43}, {434, 63, 64}};
    printf("%d\n", maxinarray((int[ROWS][COLS]){{12, 31, 35}, {23, 5, 43}, {434, 63, 64}}, ROWS * COLS));
    printf("%d\n", maxinarray(testarray, ROWS * COLS));

    return 0;
}