使用 for 循环读取 2d 像素图时 fgetc 丢弃字符
fgetc dropping characters when reading 2d pixel map with for loop
我正在从一个 PPM 文件输入一个二维像素数组,我正在测试的那个文件的宽度和长度为 5。我还知道,在 rgb 的 ppm 文件中,它不仅有 3 个颜色值一。在我写这段代码之前我已经忘记了,但是即使更新了它问题仍然存在并且问题仍然以同样的方式存在。我已将问题简化为数组以隔离问题。据我所知,这似乎既删除了字符,也用换行符替换了一些字符。如果能深入了解为什么会发生这种情况,我们将不胜感激,如果我忘记添加某些内容,我会在知道后立即更新。
#include <stdio.h>
int main(int args, char *argv[]) {
int w = 5, h = 5;
FILE *f = fopen(argv[1], "rb");
int c = 'a';//I am setting this so as to avoid the off chance of c being defined as EOF
for(int i = 0; i < h && c != EOF; i++) {
for(int j = 0; j < w && (c = fgetc(f)) != EOF; j++) printf("%c", c);
fgetc(f);//To remove the '\n' character I am not using fgets because it stops at '\n' character and it is possible for a rgb value to be == to '\n'
printf("\n");
}
fclose(f);
return 0;
}
我正在使用的测试文件:
12345
abcde
12345
abcde
12345
我得到的输出:
12345
abcd
123
5
ab
de
1
提前致谢!
编辑:这是 运行 在 windows 10 命令提示符
问题是 Windows 机器上的 '\n' 实际上最终会产生两个字符,一个回车符 return(ASCII 代码 13)和一个换行符(ASCII 代码 10)。当您以二进制模式打开文件时,这些行结尾不会转换回单个字符。您只考虑了这些字符中的一个,因此您在阅读的每一行中都按一个字符下车。
为了说明这一点,请将您的 printf("%c", c);"
替换为 printf("%d ", c);
。我得到以下输出:
49 50 51 52 53
10 97 98 99 100
13 10 49 50 51
53 13 10 97 98
100 101 13 10 49
你可以看到 10 和 13 的变化。
现在尝试添加第二个 fgetc(f);
来接收换行符,效果会更好。但是请记住,这仅适用于带有 CRLF 行结尾的文件。移植到Linux或Mac,你会遇到更多麻烦。
我正在从一个 PPM 文件输入一个二维像素数组,我正在测试的那个文件的宽度和长度为 5。我还知道,在 rgb 的 ppm 文件中,它不仅有 3 个颜色值一。在我写这段代码之前我已经忘记了,但是即使更新了它问题仍然存在并且问题仍然以同样的方式存在。我已将问题简化为数组以隔离问题。据我所知,这似乎既删除了字符,也用换行符替换了一些字符。如果能深入了解为什么会发生这种情况,我们将不胜感激,如果我忘记添加某些内容,我会在知道后立即更新。
#include <stdio.h>
int main(int args, char *argv[]) {
int w = 5, h = 5;
FILE *f = fopen(argv[1], "rb");
int c = 'a';//I am setting this so as to avoid the off chance of c being defined as EOF
for(int i = 0; i < h && c != EOF; i++) {
for(int j = 0; j < w && (c = fgetc(f)) != EOF; j++) printf("%c", c);
fgetc(f);//To remove the '\n' character I am not using fgets because it stops at '\n' character and it is possible for a rgb value to be == to '\n'
printf("\n");
}
fclose(f);
return 0;
}
我正在使用的测试文件:
12345
abcde
12345
abcde
12345
我得到的输出:
12345
abcd
123
5
ab
de
1
提前致谢!
编辑:这是 运行 在 windows 10 命令提示符
问题是 Windows 机器上的 '\n' 实际上最终会产生两个字符,一个回车符 return(ASCII 代码 13)和一个换行符(ASCII 代码 10)。当您以二进制模式打开文件时,这些行结尾不会转换回单个字符。您只考虑了这些字符中的一个,因此您在阅读的每一行中都按一个字符下车。
为了说明这一点,请将您的 printf("%c", c);"
替换为 printf("%d ", c);
。我得到以下输出:
49 50 51 52 53
10 97 98 99 100
13 10 49 50 51
53 13 10 97 98
100 101 13 10 49
你可以看到 10 和 13 的变化。
现在尝试添加第二个 fgetc(f);
来接收换行符,效果会更好。但是请记住,这仅适用于带有 CRLF 行结尾的文件。移植到Linux或Mac,你会遇到更多麻烦。