二进制文件读写: fread()/fwrite()
读:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从指定的stream流对象中获取nmemeb个大小为size字节的数据块到ptr
所在的本地内存中。
参数:
ptr 要存储数据的本地内存一般是数组或者结构体指针
size 单个数据块的元数据大小。最小单元的大小
nmemb 要获取的数据块的个数,拷贝的数据块个数。
stream 要获取数据的源文件流对象,如果是stdin表示从
键盘获取数据,如果是fp文件则表示从普通文件获取。
返回值:
成功 小于等于nemeb的整数,表示获取的数据长度
失败 小于0,结尾 0;
写:
size_t fwrite(const void *ptr, size_t size,size_t nmemb, FILE *stream);
功能:
从ptr所在本地内存中取出nmemb个大小为size的数据块写入到stream流对应
的文件流对象中。
参数:
ptr 要写的数据块地址,一般是数组或者结构体指针
size 要写的数据块元数据大小,单位是字节
nmemb 要写的数据块的个数
stream 要写的目标文件流对象。如果是stdout则表示数据会
写到终端屏幕显示,如果是fp的普通文件则会写入到文件中。
返回值:
成功 小于等于nmemb 的个数。
失败 <0
struct person
{
char name[20];
int age;
char sex;
char addr[100];
};
//保存到一个文件中?
//fwrite();
person per;sizeof(per)
注:
fread fwrite 往往都是 处理 ,数据格式相对固定的数据
struct {
};
打印构造体内容
计算bmp图片文件的高和宽
定位操作:
1.fseek
int fseek(FILE *stream, long offset, int whence);//long -->signed long
功能:
将stream流文件中的文件指针
从whence位置开始
偏移offset字节的长度
参数:
stream 要移动文件指针的目标文件流对象。
注意:不支持设备文件,一般用于普通文件。
offset
要在文件内偏移的距离,单位字节。
如果值为整数,则向文件末尾偏移
如果值为负数,则向文件开头偏移
whence 偏移的起始位置,由系统定义的三个宏开始。
SEEK_SET 文件的开头位置 offset 只能是正值
SEEK_CUR 文件的当前位置 offset 可正 可负
但是
如果当前位置与 SEEK_SET重合 offset 不能是负的
SEEK_END 文件的末尾位置 offset 可正 可负
正 --- 空洞文件
返回值:
成功: 返回 0
失败: -1;
eg:
fseek(fp,100,SEEK_SET); //从头开始往后偏移100个字节
fseek(fp,-100,SEEK_SET);
如果从文件的指定位置向后偏移过程中已经超过了文件
的当前末尾位置,则会自动以'\0'来填充文件内容,从
而形成一种被称为"空洞文件" 的特殊文件。
产生空洞文件的操作:
1.进行偏移
2.做一次写操作
fputc(0,fp);
.downloading
用途:
提前抢占磁盘空间
//获取文件大小:
fseek(fp,0,SEEK_END);
len = ftell(fp);
//定位到文件开头
fseek(stream,0L,SEEK_SET); <==>rewind(fp);
//定位到文件尾部
fseek(stream,0L,SEEK_END);
2. ftell
long ftell(FILE *stream);
功能:获取文件位置指示器的偏移量
参数:求偏移量的文件流指针
返回值:文件位置指示器到文件开头的偏移字节数
3. rewind(fp);
void rewind(FILE *stream)
功能:
获取当前文件流指针的具体位置,
一般以文件开头到当前指针的字节数为返回值。
参数:stream 要返回指针距离的文件流对象
返回值:void
移动文件指针写入数据