文件读写问题。求助,谢谢。
/*这是一个读取raw图像,统计灰度值并将结果写到result.txt中的程序,其中raw格式图像可以看做一维数组。*/
#include<stdio.h>
#include<stdlib.h>
void main()
{
int *line=new int[256*256]; //存读出来的像素
line=0;
long value[256]={0}; //存灰度值
FILE* fp=0; //读文件指针
FILE *fp2=0; //写文件指针
int i,j;
if((fp=fopen("E:\\Lena.raw","rt"))!=NULL) //读图像文件,如果打开成功
{
if((fread(&line,sizeof(int),65536,fp))==1) //如果读成功,统计灰度值
{
for(i=0;i<(256*256);i++)
{
value[line[i]]++;
}
}
else
printf("Read ERROR\n");//否则读失败
}
else
{
printf("open ERROR!\n"); //否则打开失败
exit(0);
}
if((fp2=fopen("E:\\result.txt","wt"))!=NULL) //如果打开result成功
{
printf("灰度\t频率\n");
for(j=0;j<256;j++) //写入统计灰度值
{
fwrite(&value[j],sizeof(int),256,fp2);
printf("%d\t%d\n",j,(value[j]));
}
fclose(fp2);
}
else
{
printf("WriteError!"); //否则打开失败
exit(0);
}
delete[] line;
}
最后的执行结果频率全是零。貌似还是读函数的问题。是用法不对么????求解释。。。。
[解决办法]
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待
和
fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
成功返回count
[解决办法]
for(i=0;i<(256*256);i++)
{
value[line[i]]++;
}
把line[i]打出来看看,是什么值,是否超过256了
如果这个值不是你想读的那个,那么就改你的fread函数,把第二个参数改成按1字节读试试
[解决办法]
http://docs.oracle.com/html/B14297_01/ap_imgraw.htm
不知你说的raw格式图片是不是这上面所说的,如果是,那你要先把文件头解析掉,要不然读的数据还是不对。
里面有C语言的头结构体定义,拿来直接用就可以
[解决办法]
fprintf(fp,"%d\t\t%d\n",j,value[j]);//不要用&
太长了,不细看了,%d:十进制有符号整数 %u:十进制无符号整数 %x你懂的
图像的最小单元一般都是无符号单字节