【问题标题】:C does not go to the next line while reading .ppmC 在读取 .ppm 时不会转到下一行
【发布时间】:2015-07-04 10:16:28
【问题描述】:

所以我有一个 .ppm 文件,目标是将每个像素读取到相应的 r[] g[] 和 b[] 元素。代码读取第一行(idk 正确与否),但它没有更进一步。我不确定是否需要这些getc(fp); 来跳过空格。读取每一行并将其解析为 int 不是一种选择。感谢您的帮助。

int main(int argc, char** argv) 
    {
        int height;
        int width;
        int max;
        FILE *fp;
        fp = fopen("vit_small.ppm", "r");
        fscanf(fp, "%*[^\n]\n", NULL);
        fscanf(fp, "%d %d", &width, &height);
        printf("Width is %d height is %d \n", width, height);
        fscanf(fp, "%d", &max);
        printf("Maximum value %d \n", max);
        int r [height][width];
        int g [height][width];
        int b [height][width];
        int hist [5];
        int w = 0;
        int h = 0;
        char buffer [1000];
        for (;w<height;w++)
        {
            printf("Row number %d \n", w);
            for (;h<width;h++)
                {
                fread(&r[w][h], 1, 1, fp);
                printf("%d ", r[w][h]);
                getc(fp);
                fread(&g[w][h], 1, 1, fp);
                printf("%d ", g[w][h]);
                getc(fp);
                fread(&b[w][h], 1, 1, fp);
                printf("%d ", b[w][h]);
                getc(fp);
                }
            getc(fp);
            printf("\n");
        }

        int i = 0;
        int j = 0;
        for (;i<height; i++) 
        {
            for (;j<width; j++) 
            {
                printf("%d %d %d ", r[i][j], g[i][j], b[i][j]);
            }
        printf("\n");
        }

     fclose(fp);
     FILE * res;
     res = fopen ("Image_output.ppm", "w");
     fprintf (res, "P6\n");
     fprintf(res, "%d\n", width);
     fprintf(res, "%d\n", height);
     fprintf(res, "%d\n", max);
     i = 0;
     j = 0;
     for(; i < height; i++)
     {
         for(; j < width; j++)
         {
             fprintf(res, "%d %d %d", r[i][j], g[i][j], b[i][j]);
         }
         fprintf(res,"\n");
     }
        return (EXIT_SUCCESS);
    }

【问题讨论】:

  • 完全不相关,但如果您使用 "%*..." 格式与 scanf 和家人,那么您不需要参数。
  • 另外,scanf 将格式中的所有空格视为任何空格。因此"%[^\n]" 格式将匹配任何非空白字符,而不仅仅是非换行符。因此,如果该行包含 any 空格,如普通空格或制表符或其他任何空格,则扫描将停止。因此,您不能使用它来读取(或在您的情况下丢弃)任何包含空格的行。与您的问题和您的问题并不真正相关,但很高兴知道以供将来参考。
  • 另外,您可能应该使用例如fgets 获取每一行,然后解析该行。
  • 带有“%[^\n]”的那一行只是用来跳过包含P6的第一行,因为它没用,但是谢谢
  • 对任何 scanf() 系列函数(包括 fscanf())的每次调用都需要检查返回值(而不是参数)以确保操作成功。

标签: c ppm


【解决方案1】:

PPM 的 P6 格式将每个主要存储为一个字节,并且没有行和空格。因此,如果图像是 10 x 6,那么它将在 255 和换行符之后有 180 个字节 (10x6x3)。看 Wikipedia entry on PPM.

【讨论】:

  • 谢谢,我已经解决了,但确实是这个问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-22
  • 2013-11-14
  • 2014-09-15
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-07
相关资源
最近更新 更多