【问题标题】:How do I read a text file image and save it to an array?如何读取文本文件图像并将其保存到数组中?
【发布时间】:2018-03-25 17:34:01
【问题描述】:

我必须编写一个程序来读取文本二进制图像 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");
}

我试图保存到二维数组的图像都是 50x50 并包含在 txt 文件中。

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

下面是我试图保存到数组中的超小版本,将其想象为 50x50!由于某种原因,我无法在此处粘贴完整图像,因为它重新格式化了它。不过它应该给出一个想法。

0000000
0001000
0011100
0111110
0011100
0001000
0000000

提前感谢您阅读这篇文章!

【问题讨论】:

  • fscanf("%1d", ...)fgetc(...) - '0' 有效吗?通常%d 格式会尽可能多地使用。

标签: c arrays 2d


【解决方案1】:

您的代码有两个问题。

  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() 的返回以确保调用成功。如果您使用原始代码执行此操作,它会很好地提示您第一个错误的位置。它也可用于检测无效的输入文件。

【讨论】:

  • 成功了!这真是一种解脱!我会记下“%1d”以备将来使用!感谢您发现 imageArray[N][N] “人为错误”!
  • 是的,我意识到如果我只是输入 diamond 作为输入,它只会显示 0 的背景,但如果我输入完整的文件名 Diamond.txt,它将显示完整的图像。所以我一定会提供一种方法来检查是否输入了正确的文件名。
猜你喜欢
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-17
  • 2018-01-17
相关资源
最近更新 更多