关于C语言fread的用法
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于C语言fread的用法相关的知识,希望对你有一定的参考价值。
我在写读写BMP文件时为什么总是不对
简写程序如下
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "malloc.h"
#include "ctype.h"
#include "process.h"
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
typedef unsigned char BYTE;
typedef struct tagBITMAPFILEHEADER
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
BITMAPFILEHEADER;
typedef struct tagBITMAPINFOHEADER
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
BITMAPINFOHEADER;
typedef struct tagRGBQUAD
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
RGBQUAD;
typedef struct tagBIMAPINF
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
BITMAPINFO;
void main()
char filepath[20];
FILE * fp;
BITMAPFILEHEADER header;
printf("请输入文件名.后缀:");
scanf("%s",&filepath);
if(0==(fp=fopen(filepath,"rb")))
printf("文件写入失败,按任意键结束程序!");
exit(0);
fread(&header.bfType,sizeof(WORD),1,fp);
printf("%s",header.bfType);
fclose(fp);
进行调试后总是在fread这里程序就不正常结束,为什么,求高手指教
这一句就错了。应为scanf("%s",filepath); 数组名就是其地址。
先把这里改正了再说吧。
fread()的第一个参数应该是数组。你的不是。
你的是WORD,实际是short,但你却用%s输出。建议 改
typedef struct tagBITMAPFILEHEADER
WORD bfType;
为 BYTE bfType[100]; 参考技术B printf("%s",header.bfType);
改成printf("%d",header.bfType);本回答被提问者采纳
C语言中fread函数,当文件流缓冲中剩余长度小于需要读取的长度时的问题
当输入文件为二进制,长度远大于4096的时候。
由于文件流缓冲默认为4095.
那么假设已经读取了4080个字节之后,即fp_in->_cnt的值为15,再使用fread(g_buffer, 1, 20, fp_in);函数打算一次性读出20个字节时,程序异常,fread执行时报Access Violation.
有高手帮忙解释下吗?按道理说,文件流缓冲中剩余长度不足的时候,应该会自动从外存文件中一次性读入4096个字节到缓冲中才对呀,有高手帮忙指点下吗?
也就是说:如果只剩下15个了,你要读20个,那么就会先读15个到g_buffer里,然后产生一个异常,内核重新填满缓冲区,然后再从缓冲区里读5个字节。 参考技术A 你一顿能吃四两饭,你现在已经吃了三两了,现在又有四两摆在你的面前,你不能一次把这四两又吃下去的。
程序同理,fread函数的原型如下:
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
只能读到等于buffer指向的内存区的大小的count的。追问
你没理解我的意思,
buffer指向的内存区的大小的count是够大的。
size_t fread(void *buffer, size_t size, size_t count, FILE *stream);
关键问题是(count*size)如果大于stream->_cnt时,难道fread就搞不定了吗?
如果大于count,则读一次等于count的值,再用如lseek等函数把指针指向你现在已经读到了的位置,再读。一般用一个循环。
以上是关于关于C语言fread的用法的主要内容,如果未能解决你的问题,请参考以下文章