【发布时间】: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())的每次调用都需要检查返回值(而不是参数)以确保操作成功。