代码之家  ›  专栏  ›  技术社区  ›  Gentem

如何读取文本文件图像并将其保存到数组?

  •  1
  • Gentem  · 技术社区  · 7 年前

    我必须编写一个程序,读取文本二进制图像1和0,然后根据用户的选择对图像执行各种操作。我相信我对大部分程序都很满意,我能够读入文件并显示出来。 为了继续,我需要将图像保存到2D阵列,这就是我一直坚持的。

    下面是我整个程序的一个小样本,因为它的其余部分目前都在工作,这是我试图弄清楚的一点,但在继续搜索和视频后,我一辈子都无法弄清楚这一点,也弄不清楚我到底出了什么错。

    #define N 50
    int imageArray [N][N];
    int row, col;
    int value;
    char filename[30];
    FILE *ptr_file;
    printf("Enter the full name of the input file: ");
    scanf("%s", filename);
    
    ptr_file = fopen(filename, "r");
    
    for(row = 0; row < N; row++){
        for(col = 0; col < N; col++){
            fscanf(ptr_file, "%d", &value);
            imageArray[row][col] = value;
        }
    
    }
    
    for(row = 0; row < N; row++){
        for(col = 0; col < N; col++){
            printf("%d", imageArray[N][N]);
        }
        printf("\n");
    }
    

    我试图保存到2D阵列的图像都是50x50,包含在txt文件中。

    上面的代码当前输出所有0。图像的背景由0组成,而图像本身由1组成。

    下面是一个 超小型版本 关于我试图保存到阵列中的内容,请将其想象为50x50!由于某种原因,我无法将完整图像粘贴到这里,因为它重新格式化了它。但它应该给出一个想法。

    0000000
    0001000
    0011100
    0111110
    0011100
    0001000
    0000000
    

    提前感谢您阅读本帖!

    1 回复  |  直到 7 年前
        1
  •  0
  •   afic    7 年前

    您的代码有两个问题。

    1. 正如Mike P所述,您应该将“%1d”与fscanf()一起使用,否则每个fscanf()调用都将读取整行,因为它将继续读取,直到第一个数字字符系列的末尾,其中包含“%d”。

    2. 你的打印循环正在打印 imageArray[N][N] 而不是 imageArray[row][col]

    实现了这两个修复后,我使代码按预期运行。

    int imageArray [N][N];
    int row, col;
    int value;
    char filename[30];
    FILE *ptr_file;
    printf("Enter the full name of the input file: ");
    scanf("%s", filename);
    
    ptr_file = fopen(filename, "r");
    
    for(row = 0; row < N; row++){
        for(col = 0; col < N; col++){
            fscanf(ptr_file, "%1d", &value);
            imageArray[row][col] = value;
            printf("%d %d\n", row, col);
        }
    
    }
    
    for(row = 0; row < N; row++){
        for(col = 0; col < N; col++){
            printf("%d", imageArray[row][col]);
        }
        printf("\n");
    }
    

    另外,您应该检查fscanf()的返回,以确保调用成功。如果您使用原始代码这样做,它将为您提供关于第一个错误位置的良好提示。它还可用于检测无效的输入文件。