最详细二进制文件操作fwrite、fseek、fread、ftell、getFilesize…

一、fread()

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)

参数:

  • ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。【读出后存放数据的地址】
  • size -- 这是要读取的每个元素的大小,以字节为单位。
  • nmemb -- 这是元素的个数,每个元素的大小为 size 字节。【读几个元素】
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。【目标文件】

返回:

成功读取的元素总数会以 size_t 对象返回,size_t 对象是一个整型数据类型。如果总数与 nmemb 参数不同,则可能发生了一个错误或者到达了文件末尾。

二、fwrite()

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)

参数:

  • ptr -- 这是指向要被写入的元素数组的指针。【数据来源:数组】
  • size -- 这是要被写入的每个元素的大小,以字节为单位。【数组元素大小】
  • nmemb -- 这是元素的个数,每个元素的大小为 size 字节。【写入元素的个数】!!!
  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。【目标文件】

返回:

如果成功,该函数返回一个 size_t 对象,表示元素的总数,该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。

三、fseek 偏移文件内指针

fseek一般用于二进制文件的指针移动,也可以用于文本文件,但操作的stream必须是已经打开的文件。如果没有打开的文件,那么将会出现错误。

int fseek(FILE *stream, long int offset, int whence)

参数:

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。【目标文件】
  • offset -- 这是相对 whence 的偏移量,以字节为单位。
  • whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
常量描述
SEEK_SET文件的开头
SEEK_CUR文件指针的当前位置
SEEK_END文件的末尾

返回:

如果成功,则该函数返回零,否则返回非零值

偏移必须正确:fseek的第二个参数offset偏移位置正数表示向后(文件结尾的方向)移动,负号表示向前(文件开头的方向)移动。

使用这个文件指针移动函数需要注意:

1. 文件指针fp必须正确,否则返回错误。 

2. offset和whence的值必须逻辑正确(偏移必须正确),否则文件指针会移动到未知位置。 

3. 移动文件指针后,原有的读取位置将失效,需要重新读取数据。 

4. 移动文件指针是较为消耗性能的操作,不建议频繁调用。

5. 调用fclose()后文件指针将不再有效,无法再次访问文件。

6. 该函数依赖于操作系统,移植性较差,实现细节依赖具体系统。

(一)fseek(fp,0,SEEK_END)光标移至最末

fseek(fp,0,SEEK_END)是一个文件操作函数,用于移动文件指针到文件末尾,我们可以利用这个功能读取文件末尾的数据,实现类似文件尾部插入或者修改的操作。

这个函数移动文件指针的主要步骤为:

1. 检查文件指针fp是否正确,如果不正确会返回错误。

2. 当whence为SEEK_END时,offset值为0,表示从文件末移动文件指针。

3. 函数会将文件指针移动到文件末尾的位置。

4. 如果移动成功,函数返回0,否则返回-1。

使用这个文件指针定位函数需要注意:

1. 文件指针fp必须是有效的,通过fopen()等函数打开的文件流。否则会返回错误。

2. whence参数为SEEK_END时offset必须小于等于0,表示从文件末尾向前移动。其他值会导致文件指针定位错误。

3. 移动文件指针后,原先的读取位置将失效。需要重新定位指针才能继续之前的读写操作。

 4. 移动文件指针是一个相对比较消耗资源的操作,不建议频繁调用。 

5. 调用fclose()关闭文件后,文件指针将不再有效,无法继续定位或访问。 

6. 该函数是C语言标准库中的文件操作函数,不具备跨平台移植性,实现依赖于操作系统。

fseek(fp,0,SEEK_END);//将文件指针偏移到文件末尾
int fielsize=ftell(fp);//  判断当前文件指针移动了多少个字节,即移动到了末尾即该文件含字节数
if (size != fielsize)//如果文件大小与定值结构体大小不一致 这初始化该定值设,size为预定文件大小

(二)fseek(fp,0,SEEK_SET)光标移至最前

fseek(fp,0,SEEK_SET)也是一个文件操作函数,用于将文件指针移动到文件起始位置,可以利用这个功能实现从文件起始位置进行数据的修改、删除或插入等操作。

这个函数移动文件指针的主要步骤为:

1. 检查文件指针fp是否正确,如果不正确会返回错误。

2. whence为SEEK_SET时,offset值为0,表示从文件起始位置移动文件指针。 

3. 函数会将文件指针移动到文件开始的位置。

4. 如果移动成功,函数返回0,否则返回-1。

使用这个文件指针定位函数需要注意:

1. 文件指针fp必须是有效的,通过fopen()等函数打开的文件流。否则会返回错误。

 2. whence参数为SEEK_SET时offset必须大于等于0,表示从文件起始位置向后移动。其他值会导致文件指针定位错误。

3. 移动文件指针后,原先的读取位置将失效。需要重新定位指针才能继续之前的读写操作。

 4. 移动文件指针是一个相对比较消耗资源的操作,不建议频繁调用。

5. 调用fclose()关闭文件后,文件指针将不再有效,无法继续定位或访问。

6. 该函数是C语言标准库中的文件操作函数,不具备跨平台移植性,实现依赖于操作系统。

在读取(fread)和写入(fwrite)前或后一般都需要fseek首先定位到需要的光标位置。

四、ftell 读取文件内的位置标识符(文件内指针)

long int ftell(FILE *stream)

参数:

  • stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。

返回:

该函数返回位置标识符的当前值。如果发生错误,则返回 -1L,全局变量 errno 被设置为一个正值。

这个函数获取文件指针位置的主要步骤为:

1. 检查文件指针fp是否正确,如果不正确会返回-1L。

2. 函数会返回文件指针当前的位置,相对于文件起始位置的偏移量。

3. 返回值类型为long int,可以精确表示文件指针的位置。 

4. 如果获取文件指针位置成功,函数会返回当前位置的偏移量,否则返回-1L。

使用这个文件指针位置获取函数需要注意:

1. 文件指针fp必须是有效的,通过fopen()等函数打开的文件流。否则会返回-1L错误值。

2. 返回的偏移量是相对文件起始位置的字节数,所以文件指针最远可以访问文件大小-1的位置。 

3. 如果文件指针超出文件尾部,此函数仍然可以获取位置,但实际读取的数据未定义。

4. 该函数返回的位置在下次文件操作后可能会变化,需要及时记录或更新。

5. 调用fclose()关闭文件后,文件指针将不再有效,无法继续获取位置或访问。 

6. 该函数是C语言标准库中的文件操作函数,不具备跨平台移植性,实现依赖于操作系统。

五、fopen

FILE *fopen(const char *filename, const char *mode)

参数:

  • filename -- 字符串,表示要打开的文件名称。
  • mode -- 字符串,表示文件的访问模式,可以是以下表格中的值:
模式        描述
"r"打开一个用于读取的文件。该文件必须存在
"w"打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
"r+"打开一个用于更新的文件,可读取也可写入。该文件必须存在
"w+"打开可读写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
"rw+"读写打开一个文本文件,允许读和写。
"rb"打开一个用于读取的二进制文件。该文件必须存在
"wb"只写打开或新建一个二进制文件;只允许写数据
"rb+"读写打开一个二进制文件,允许读数据
"wb+"读写打开或建立一个二进制文件,允许读和写

返回:

成功则返回一个 FILE 指针。

失败返回 NULL,且设置全局变量 errno 来标识错误。

六、fclose

int fclose(FILE *stream)

参数:stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了要被关闭的流

返回值:如果流成功关闭,则该方法返回零。如果失败,则返回 EOF。

七、getFilesize

使用fopen,fseek,ftell编写获取文件大小函数

long getFilesize(char *filename) 
{
    FILE *fp = fopen(filename, "rb");
    fseek(fp, 0, SEEK_END);
    long filesize = ftell(fp);
    fclose(fp);
    return filesize;
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二进制文件读写源代码主要包含三个函数:fopenfseekfwrite。 1. fopen函数 fopen函数用于打开文件,并返回一个指向该文件的指针。 语法:FILE *fopen(const char *filename, const char *mode); 参数说明: - filename:文件名,可以包含文件路径。 - mode:打开文件的模式。有以下几种可用: - "r":只读打开文件。 - "w":写入打开文件。如果文件存在,则清空文件内容;如果文件不存在,则创建文件。 - "a":追加打开文件。如果文件存在,则在文件末尾添加数据;如果文件不存在,则创建文件。 - "rb":只读打开二进制文件。 - "wb":写入打开二进制文件。如果文件存在,则清空文件内容;如果文件不存在,则创建文件。 - "ab":追加打开二进制文件。如果文件存在,则在文件末尾添加数据;如果文件不存在,则创建文件。 返回值:如果文件打开成功,则返回一个指向文件的指针;否则返回NULL。 2. fseek函数 fseek函数用于将文件指针定位到指定位置。 语法:int fseek(FILE *stream, long offset, int whence); 参数说明: - stream:文件指针。 - offset:偏移量。正数表示向后偏移,负数表示向前偏移。 - whence:偏移起始位置。有以下三种可用: - SEEK_SET:从文件开头开始偏移(即绝对偏移)。 - SEEK_CUR:从当前位置开始偏移(即相对偏移)。 - SEEK_END:从文件末尾开始偏移。 返回值:如果函数执行成功,则返回0;否则返回非0的值。 3. fwrite函数 fwrite函数用于将指定数据写入文件。 语法:size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); 参数说明: - ptr:数据存储的位置(即数据的首地址)。 - size:要写入的数据块大小(单位:字节)。 - count:要写入的数据块个数。 - stream:文件指针。 返回值:返回实际写入的数据块个数。如果返回值小于count,则表示出现了写入错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值