LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1265|回复: 4

C语言中fread读文件,屏幕打印正确,但运算不对,求高人帮帮

[复制链接]
发表于 2008-7-19 14:33:33 | 显示全部楼层 |阅读模式
本人写了一个C语言读灰度图像文件t.jpg的程序:读出的数据显示出来是对的,但运算起来不对劲
需要说明下我这里的jpg是没有经过压缩编码的原始灰度数据,
只是在文件前三行自动加上了如下的头文件,t.jpg文件的全部内容如下,:
P2
64 48
255
098 111 110 097 111 113
101 115 116 112 124 112
113 127 113 112 112 101
112 110 099 113 113 165
178 112 113 126 115 116
125 112 113 114 103 113
112 165 172 110 119 124
093 098 112 111 110 097
......接下来的数据我在程序中没有读,只读1*48个测试文件中共有64*48个灰度数据

程序如下(篇幅限制,我这里只读文件开始1*48个数据):
{
FILE * fp=fopen("t.jpg","r");   //指针指向t.jpg
int buf[64][48],test[64][48];
int i,j;
fseek(fp,13,0);               //这里我使用fseek函数跳过文件中开始的 非图像数据的前四行
     for (i=0;i<1;i++)  //篇幅限制 只读出一行(这里每行48个数据)
{
         for(j=0;j<48;j++) //每行48个数据
  {
  fread(&buf[j],4,1, fp);  //用fread函数读出文件到buf,
              我的设置是以4个字节为基本单位读出,因为原数据里如“098 ”有一个空格,我也把它读进来了
  if((j%6)==5){fseek(fp,1,1);} //因为原数据第五行开始每行(六个数据)后有一个回车,
                                               通过指针+1跳过回车
  test[j]=(buf[j]+1); //读完数据后,我再把buf读到的数据每个都加1看正不正确
  }
}
printf("buf= %s\n",buf);           //显示读到的数据
printf("test= %s\n",test);  //显示加1后的数据
fclose(fp);
}
运行后,结果如下:
buf= 098 111 110 097 111 113 101 115 116 112 124 112 113 127 113 112 112 101 112 110
099 113 113 165 178 112 113 126 115 116 125 112 113 114 103 113 112 165 172 110
119 124 093 098 112 111 110 097
test= 198 211 210 197 211 213 201 215 216 212 224 212 213 227 213 212 212 201 212 210
199 213 213 265 278 212 213 226 215 216 225 212 213 214 203 213 212 265 272 210
219 224 193 198 212 211 210 197
结果中test里的元素不中buf+1,而成了buf+100,实在不明白怎么回事,请高手帮帮小弟!万分感谢
发表于 2008-7-19 15:34:57 | 显示全部楼层
大小端...

用 int 保存 4 个 char 不是不行, 但是由于大小端的问题, 可能导致非预期的结果. 为何不直接把 4 个 char 解析成一个 8 位长的数值来保存呢? 可以节省内存, 还免去出现这种问题的可能.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-7-19 17:08:31 | 显示全部楼层
Post by remote fish;1876364
大小端...

用 int 保存 4 个 char 不是不行, 但是由于大小端的问题, 可能导致非预期的结果. 为何不直接把 4 个 char 解析成一个 8 位长的数值来保存呢? 可以节省内存, 还免去出现这种问题的可能.



谢谢这位大哥,我是在PC上运行的,你说的4个char是不是指将ASCII转化,可是我不知道怎么改才能达到这样的效果,你能指点下吗,本人学得不好 十分感谢
回复 支持 反对

使用道具 举报

发表于 2008-7-20 17:15:46 | 显示全部楼层
可以使用  htons ntohs htonl ntohl系列函数。
回复 支持 反对

使用道具 举报

发表于 2008-7-20 20:49:09 | 显示全部楼层
比如 fscanf, atoi. 请自行查看相关的 man pages.

用 htons 之类的确实可以实现字节序的统一, 问题在于这里本不应该引进字节序问题的
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表