【问题标题】:Reading two dimensional array from file and printing it从文件中读取二维数组并打印
【发布时间】:2023-04-09 11:17:01
【问题描述】:

我的代码有一些问题。一切安好; gcc 没有显示错误或警告; valgrind 说没有内存泄漏,但我的数组没有打印出来,我不知道为什么。是fscanf() 工作不正常还是我打印不正确?

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

int arrsize (FILE *file)
{
    if (file == NULL) {
        printf("Error: file pointer is null.");
        return 0;
    }
    int sizer;
    fscanf(file, "%d", &size);
    return size;
}


int main()
{
    int i = 0, j = 0, k = 0,a=0;

    FILE *fp;
    if ((fp = fopen("matrix.txt", "r")) == NULL)
    {
        printf("Error: file pointer is null.\n");
        return 1;
    }
    int size = arrsize(fp);

    printf("Array size is %d x %d \n", size, size);

    double **array = (double **)malloc(size * sizeof(double *));
    for (i; i < size; i++)
       array[i] = (double *)malloc(size * sizeof(double));

    for (i; i < size; i++)
    {
        for (j = 0; j < size; j++)
        {
            fscanf(fp, " %lf", &array[i][j]); 
            printf(" %lf ",array[i][j]);
        }
    }

    for (k ; k < size; k++) {
        free(array[k]);        
    }
    free(array);

    fclose(fp);
    return 0;
}

【问题讨论】:

  • int sizer; --> int size;
  • for (i; i &lt; size; i++) { for (j = 0; j &lt; size; j++) --> for (i = 0; i &lt; size; i++) { for (j = 0; j &lt; size; j++)
  • 您没有展示您正在阅读的数据文件的一个小示例,也没有展示您的实际或预期输出。这些是 MCVE (minimal reproducible example) 的重要组成部分。
  • 您可能应该在打印矩阵的每一行后添加一个换行符。读取整个矩阵然后将整个矩阵打印为两组单独的循环也是一个更严格的测试。许多程序出错的原因是,虽然在读取后立即打印了值,但输入完成后该值不再正确。
  • @BLUEPIXY:我同意循环中的更改是可取的。但是,这并不是绝对必要的,因为 int i = 0, … 确实将 i 初始化为 0

标签: c arrays linux gcc


【解决方案1】:

检查fscanfmalloc的返回以确保成功。
fflush ( stdout); 添加到打印循环中,因为格式字符串没有换行符。

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

int arrsize (FILE *file)
{
    if (file == NULL) {
        printf("Error: file pointer is null.");
        return 0;
    }
    int size;
    if ( 1 == fscanf(file, "%d", &size)) {
        return size;
    }
    return -1;
}


int main()
{
    int i = 0, j = 0, k = 0;

    FILE *fp;
    if ((fp = fopen("matrix.txt", "r")) == NULL)
    {
        printf("Error: file pointer is null.\n");
        return 1;
    }
    int size = arrsize(fp);
    if ( -1 == size) {
        fprintf( stderr, "Error: problem parsing array size.\n");
        return 1;
    }

    printf("Array size is %d x %d \n", size, size);

    double **array = NULL;
    if ( NULL != ( array = malloc(size * sizeof(double *)))) {
        for (i = 0; i < size; i++) {
            if ( NULL == ( array[i] = malloc(size * sizeof(double)))) {
                fprintf ( stderr, "problem allocation array[]\n");
                while ( i) {
                    i--;
                    free ( array[i]);
                }
                free ( array);
                return 1;
            }
        }
    }
    else {
        fprintf ( stderr, "problem allocation array\n");
        return 1;
    }

    for (i = 0; i < size; i++)
    {
        for (j = 0; j < size; j++)
        {
            if ( 1 == fscanf(fp, "%lf", &array[i][j])) {
                printf(" %lf ",array[i][j]);
            }
            else {
                fprintf ( stderr, "problem parsing double\n");
                break;
            }
        }
        fflush ( stdout);
    }

    for (k = 0; k < size; k++) {
        free(array[k]);
    }
    free(array);

    fclose(fp);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多