C -使用for循环读取2d像素图时删除字符



我正在从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命令提示符

问题是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上,你会遇到更多的麻烦。

相关内容

  • 没有找到相关文章

最新更新