C 了解fread()存储rgb像素值

C 了解fread()存储rgb像素值,c,pointers,fread,C,Pointers,Fread,我相信for循环应该被fread替换,但是,我不清楚fread将如何工作 fread如何知道给定位置处绿色像素的值以及保存该值的位置。我的理解是,我有一块堆内存,一个矩形有一个待定的像素数。每个像素有3个值。fread(或我可以使用的任何其他方法)将如何使用 如果有人能解释一下下面的fread行如何与我的代码一起工作?这是一个任务,我只是想了解正在发生什么,因为这是一个我们将建设 fread(像素、大小(像素)、宽度*高度、文件) typdef结构 { 无符号字符绿色; 无符号字符

我相信for循环应该被fread替换,但是,我不清楚fread将如何工作

fread如何知道给定位置处绿色像素的值以及保存该值的位置。我的理解是,我有一块堆内存,一个矩形有一个待定的像素数。每个像素有3个值。fread(或我可以使用的任何其他方法)将如何使用

如果有人能解释一下下面的fread行如何与我的代码一起工作?这是一个任务,我只是想了解正在发生什么,因为这是一个我们将建设

fread(像素、大小(像素)、宽度*高度、文件)

typdef结构
{       
无符号字符绿色;
无符号字符蓝色;
无符号字符红色;
}像素;
类型定义结构
{       
像素*像素;
}色彩;
图像*读取图像(字符*文件名)
{
整数宽度、高度、最大值;
int imgSize=宽度*高度*大小(像素);
//fscanf线由教授给出
fscanf(f_in,“%s\n%d%d\n%d\n”、magicNum、宽度、高度和最大值);
像素=malloc(imgSize);

对于(inti=0;i,从表面上看,你是在读一本书

阅读标题,执行以下操作:

int width, height, max;
my_assert(3==fscanf(f_in, "P6%d%d%d ", &width, &height, &max));
/* TODO: error handling */
格式说明符告诉它读取预期的幻数(“P6”),然后将第二、第三和第四个字作为整数(隐式跳过中间的任何空格),然后使用空格(“根据PPM,主要是换行符”)将文件读取位置设置为二进制数据开始的位置。您可能应该确保宽度/高度/最大值在应用程序期望的范围内,并且可以处理

然后将其余数据读入内存。
fread
从当前读取位置读取
size*count
字节;无格式:

int channel_width = max < 256 ? 1 : 2; /* PPM channel width can be either 1- or 2-byte */
int rgb = 3;
int imgsize = width*height*rgb*channel_width;
void* texture = malloc(imgsize);
my_assert(imgsize==fread(texture, 1, imgsize, f_in));
/* do something with the texture memory */
int channel_width=max<256?1:2;/*PPM通道宽度可以是1字节或2字节*/
int rgb=3;
int imgsize=宽度*高度*rgb*通道宽度;
void*texture=malloc(imgsize);
我的断言(imgsize==fread(纹理,1,imgsize,f_-in));
/*用纹理记忆做点什么*/
此时,您可以将纹理指针投射到您喜欢使用的任何结构,例如,
pixel1D*pixs=texture
(如果通道长度为2字节,请小心,因为您发布的结构不是).我发现一个带有meta的结构和一个无类型的内存块更灵活,因为它主要与OpenGL一起工作。也许这就是你打算用
图像
类型所做的


代码完全未经测试。祝您调试愉快。

fread()
不知道您读取的文件的任何信息,它只是从中读取一块数据。由您来解释该块。
fscanf()
行意味着它是一个文本文件。
fread()
与二进制文件一起使用,它通常不适用于文本文件。在读入
宽度
高度
后,需要设置
imgSize
。如果是文本文件,我不明白他如何从中读取图像数据。没有
像素
的声明。吹毛求疵:从不
断言()
任何您想要实际运行的代码。NDEBUG define会删除
assert
及其括号中的所有内容。而且它通常会在您最不希望的时候在发布/优化版本中设置。@ZanLynx
#undef NDEBUG
-),但我没有找到好的替代方法。
expr?exit(-1):0
很伤心…有什么提示吗?是的。如果语句检查并调用perror()和exit(),请正确编写。如果太冗长,请编写自己的宏。但不要编写assert()。@ZanLynx Edited。