当用for循环读取2d像素图时fgetc丢弃字符

时间:2016-08-10 19:33:04

标签: c for-loop multidimensional-array c11 fgetc

我正在努力从PPM文件中输入一个2d像素阵列,我正在测试宽度和长度为5.我也知道在ppm文件中rgb它有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命令提示符

上运行的

1 个答案:

答案 0 :(得分:0)

问题是Windows机器上的'\ n'实际上最终产生了两个字符,回车符(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,你会遇到更多麻烦。