C语言fread和fwrite问题

#include <stdio.h>
#include <stdlib.h>

#define U8 char
typedef struct
{
U8 fileName[9];
}Name;

//----------------------012345678
#define FILENAME_START "10000.bmp"
#define OUTPUT_FILE "OutPut.bin"

Name nxtName (Name preName);
void seekLoc (FILE *fp);
U8 * readFile (FILE *fp);
void writeFile (U8 *buf,FILE *outFile);

int main ()
{
Name name_BMP;
FILE *input,*output;
strcpy(name_BMP.fileName,FILENAME_START);//FILENAME_START;
output = fopen (OUTPUT_FILE,"w+");
name_BMP = nxtName (name_BMP);

while ((input = fopen (name_BMP.fileName,"r+")) != NULL)
{
seekLoc (input);
printf ("%s\n",name_BMP.fileName);
writeFile (readFile (input),output);
name_BMP = nxtName (name_BMP);
}
fclose (output);
return 0;
}

Name nxtName (Name preName)
{
int count;
count = (preName.fileName[1] - 48) * 1000 + (preName.fileName[2] - 48) * 100 + \
(preName.fileName[3] - 48) * 10 + (preName.fileName[4] - 48);

count ++;
preName.fileName[1] = (count / 1000) + 48;
preName.fileName[2] = ((count % 1000) /100) + 48;
preName.fileName[3] = ((count % 100) / 10) + 48;
preName.fileName[4] = (count % 10) + 48;
return preName;
}

void seekLoc (FILE *fp)
{
fseek (fp,62L,0); //locate the pt
}

U8 * readFile (FILE *fp)
{
U8 buf[1024]; //(128*64)/8 = 1024

fread (buf,1024,1,fp); //read a file
printf ("*");
fclose (fp);
return buf;
}

void writeFile (U8 *buf,FILE *outFile)
{
fwrite (buf,1024,1,outFile); //write to output file
}

代码如上,想实现的功能是将N张BMP图片去掉文件头后按顺序合并到一个文件里,编译和运行都成功,但查看输出的文件时发现文件大小小了很多(与原BMP文件大小总和相比),且似乎丢了很多信息(比如我第一张图从0x3E到0x410都是FF,但输出文件中FF到0x140时便不是FF了。)50分求解答。
之前就是wb,rb,因为有这个问题所以才换的r+,两者输出结果是一样的。

二楼的,感谢指出不足,wb和rb也解决不了问题,至于1K是因为这个程序要处理的每个文件数据区都只有1K,为了图省事所以这么写的

我只能说你写得一塌糊涂...

随手写的不保证对,只是说明几个问题。1. 你每个文件不管多少只读1K;2. w+ r+是不行的,会把0x0a变成0x0d 0x0a; 3. 你竟然直接返回局部变量

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define U8 char
typedef struct
{
U8 fileName[9];
}Name;

//----------------------012345678
#define FILENAME_START "10000.bmp"
#define OUTPUT_FILE "OutPut.bin"

Name nxtName (Name preName);
void seekLoc (FILE *fp);
U8 * readFile (FILE *fp, long *l);
void writeFile (U8 *buf, long l, FILE *outFile);

int main ()
{
Name name_BMP;
FILE *input,*output;
strcpy(name_BMP.fileName,FILENAME_START);//FILENAME_START;
output = fopen (OUTPUT_FILE,"wb");
name_BMP = nxtName (name_BMP);

while ((input = fopen (name_BMP.fileName,"rb")) != NULL)
{
U8 *buf;
long l;

seekLoc (input);
printf ("%s\n",name_BMP.fileName);

buf = readFile (input, &l);
writeFile (buf, l,output);
name_BMP = nxtName (name_BMP);
}
fclose (output);
return 0;
}

Name nxtName (Name preName)
{
int count;
count = (preName.fileName[1] - 48) * 1000 + (preName.fileName[2] - 48) * 100 + \
(preName.fileName[3] - 48) * 10 + (preName.fileName[4] - 48);

count ++;
preName.fileName[1] = (count / 1000) + 48;
preName.fileName[2] = ((count % 1000) /100) + 48;
preName.fileName[3] = ((count % 100) / 10) + 48;
preName.fileName[4] = (count % 10) + 48;
return preName;
}

void seekLoc (FILE *fp)
{
fseek (fp,62L,0); //locate the pt
}

U8 * readFile (FILE *fp, long *l)
{
U8 *buf; //(128*64)/8 = 1024

fseek(fp, 0, SEEK_END);
buf = (U8 *)malloc(*l = ftell(fp));

fseek(fp, 0, SEEK_SET);

fread (buf,*l,1,fp); //read a file
printf ("*");
fclose (fp);
return buf;
}

void writeFile (U8 *buf, long l, FILE *outFile)
{
fwrite (buf,l,1,outFile); //write to output file

free(buf);
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-05-15
打开文件时的w+和r+是否应该改为wb和rb ?

b表示二进制模式打开文件,而+表示以读写模式打开文件(而非只读或者只写)

c 语言 fread 和 fwrite问题
fread和fwrite用于2进制读写的!1:没有区别;但是用size是4,nmemb是3的方式会块点,如果几G的大文件会很明显!2:一样,3:一样的操作,因为都是4个字节,但是结果会让你惊讶;因为int和float的存取方式不同;所以解析方式也不同,一样的32位,不同的解析方式早就不同的结果!你问这3个问题...

C语言fread&&fwrite问题 达人进
言不在多!fread&&fwrite,都是以二进制方式,操作(读或写)文件的 你的文件,貌似是文本类型,用gets或fscanf等,对齐进行操作,更简单点 if(strcmp(login.Account,Test.Account))是两者不等的意思,相等应该这样写:if(strcmp(login.Account,Test.Account)==0)如果输入的正确,那估计是你读入的不对...

C语言 fwrite fread 函数怎么使用? 始读取不到数据 也可能我根本没写...
C语言里的fwrite,是带写缓冲的。你往文件里写数据后,数据并不是马上就写到文件里。主要在下面三种情况下会写到文件里:(1)缓冲区满了 (2)使用了fflush函数 (3)使用了fclose函数 所以你的错误就在于,在saveToDisk函数的最后,没有把文件关闭。另外,对文件操作结束,把文件关闭掉本身就是个好...

C语言fread和fwrite问题
fwrite (buf,l,1,outFile); \/\/write to output file free(buf);}

C语言的fread和fwrite函数剖析,fread后fwrite,内容并没有得到修改_百度...
你好,你这个自定义函数的主要问题是:读取一次就关闭文件了,如果需要再次读取就需要再次打开,但说实话,不主张这种用法,我们一般的用法是全部读取文件的内容但结构体链表或结构体数组中,然后以此判断结构体链表或结构体数组的adder[0].num,判断完之后再次写入文件,这样才可以,你的代码只能判断文件的...

关于fwrite,fread的问题...
fread(&s[i],sizeof(struct test),1,stream);} 这样是读三次,每次读出一个结构体的数据8个字节,前4个为一个指针,后4个为一个int型数据 不过这样修改后仍然读不出期望的数据 (如果把读写文件合写为一个可以显示读出正确数据的假象)这是因为,你存储的指针指向的地址是内存,而内存的数据是变化...

ccs3.3里的函数fwrite,fclose,fprintf等编译出错
fwrite,fclose,fprintf,fread这几个文件读写函数是C语言里标准输入输出函数。你需要#include <stdio.h>应该就能解决这几个函数未定义的问题。exit和_ftable似乎是自己定义的函数。你需要找到这两个函数定义或者自己写这两个函数。

fwrite和fread连用时发生死循环
首先,假设你的文件是按照程序里的逻辑编写的。在上面的前提下,来说说你这里的问题。需要注意的是,在这个函数中,出现了读和写的交替执行。在C标准库中,文件在以读写模式打开时,有一点是需要注意的,那就是在读和写的转换时需要做一些额外的工作,否则就出现“莫名其妙”的错误。额外工作是什么呢...

fread()和fwrite()函数的问题。
fwrite(&k,sizeof(int),1,fp)k 是记录的个数,本句是在文件中“第一个字”写入 一整形数标记了本文件中总的记录的个数 是在第一个字位置,当然不可以放到文件尾,在读如程序部分,首先读出该整形 数 在void loaddate() 中 fread(&k,sizeof(int),1,fp); \/\/读取之前成功写入的次数k...

c语言中用fread和fwrite函数读数据时怎样判断文件结束?
使用feof()来判断,返回非0就是结束了。if (feof(fp))... 此时就表明文件结束了,别再读了

相似回答