提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、fread()函数
fread 函数作用 : 从文件中读取若干字节数据到内存缓冲区中
//fread 函数原型 :
size_t fread( void *buffer, size_t size, size_t count, FILE *stream );
void *buffer 参数 : 将文件中的二进制数据读取到该缓冲区中
size_t size 参数 : 读取的 基本单元字节大小 , 单位是字节 , 一般是 buffer 缓冲的单位大小 ;
如果 buffer 缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
如果 buffer 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;
size_t count 参数 : 读取的基本单元个数 ;
FILE *stream 参数 : 文件指针 ;
size_t 返回值 : 实际从文件中读取的基本单元个数 ;
读取的字节数是 基本单元数 * 基本单元字节大小 ;
fread返回值解释
fread(buffer, 1, 1024, p);
该函数表示一个从文件p中读取一个字节,读取1024次,
读取完成之后函数返回值为函数从文件p中读取到真正的字节数
比如文件中只有10个字节,则函数返回值为10,没有字节则返回0;
fread可以循环调用,函数会自动调整在文件中的指针位置,
从而能够读取文件中所有内容
二、 fwrite()函数
write函数
功能:是用于写入二进制数据
size_t fwrite(void*buffer,size_ size,size_t count,FILE*stream)
1.buffer:是一个指向用于保存数据的内存位置的指针
(是一个指针,对于fwrite来说,是要获取数据的地址)
2.size: 是每次读取的字节数
3.count: 是读取的次数
4.stream: 是数据写入的流(目标指针的文件)
返回值:是实际写入的元素(并非字节)数目
ps:如果输入过程中遇到了文件尾或者输出过程中出现了失误,这个数字可能比请求的元素数目要小
fread()与fwrite()代码示例 :
实现功能:copy一个文件内容到另一个文件
注意:我们在传递size大小的时候最好传递单字节,等价于fgetc();这样可以防止传递size过大,而文件中字节太小,从而操作读取不到文件字节。
代码如下
#include <stdio.h>
#include <stdlib.h>
#include<errno.h>
int main(int argc ,char ** argv)//命令行传参 第一个参数表示命令行传递参数个数 第二个参数保存命令行传递的参数
{
int n;
FILE *pr=NULL;
FILE *ps=NULL;
char buffer[1024];
pr = fopen(argv[1],"r");//只读格式打开temp文件,无文件则报错
ps = fopen(argv[2],"w");//打开test文件只写,无文件则创建
if(pr==NULL)//打开 文件失败
{
perror("fopen()");
exit(1);
}
while((n=fread(buffer,1,1024,pr))>0)//一次从文件中读一个字节 读取1024次 并存入buffer数组中
//每次从pr文件读到的字节数存到n中
//当文件内容被读完时,再次调用fread会导致读不到内容,返回值为0
{
fwrite(buffer,1,n,ps);//每次从buffer数组中一次读取一个字节,读取n次,读取n个字节存入ps文件中
}
fclose(ps);//关闭所打开的两个文件
fclose(pr);
exit(0);
}
文件copy成功
三、fseek()函数
fseek() 函数:调节文件指针位置
应用场景:当我们使用文件指针通过fwrite()函数向文件中输入数据,假设数据为字符串“麻辣香锅”,输入完毕后文件指针的指向位置实际上是“锅”的后面,相当于光标。此刻如果使用fread函数是无法正常读取文件内容的,原因是fread只能读取指针往后的内容。需要将文件指针前置,这时候就需要用到fseek函数。
int fseek(FILE *stream, long int offset, int whence)
参数
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
offset -- 这是相对 whence 的偏移量,以字节为单位。
whence -- 这是表示开始添加偏移 offset 的位置。它一般指定为下列常量之一:
常量 描述
SEEK_SET 文件的开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件的末尾
返回值
如果成功,则该函数返回零,否则返回非零值。
比如我们向文件中某位置输入了10个字节的内容,我们如果想立即读取这10个字节的内容我们就可以调用fseek函数(),代码如下
fseek(file,-10,SEEK_CUR);
四、ftell()函数
ftell() 函数的作用是 获取文件的当前指针位置相对于文件首地址的 偏移字节数,即获取文件中的当前指针位置 ;
ftell 函数原型 :
#include <stdio.h>
long ftell(FILE *stream);
ftell 使用场景 : 随机方式存取文件时 , 使用 fseek 函数来回移动指针 , 不容易确定当前指针位置 , 通过调用 ftell 函数确定指针位置 ;
五、rewind()函数
rewind()函数作用:将文件指针设置在流的开头。在需要多次使用流时,这就很有用。
ewind()函数的语法:
void rewind(FILE *stream)
rewind()函数等价于fseek(file,0,SEEK_SET)函数
示例:
创建一个源文件:rewind-file.c,其代码如下所示 -
#include<stdio.h>
void main() {
FILE *fp;
char c;
fp = fopen("string-file.txt", "r");
while ((c = fgetc(fp)) != EOF) {
printf("%c", c);
}
rewind(fp); // moves the file pointer at beginning of the file
// 不用重新打开文件,直接从头读取内容
while ((c = fgetc(fp)) != EOF) {
printf("%c", c);
}
fclose(fp);
}
六、fflush()函数
fflush()函数:更新缓存区,或者说强行刷新缓冲区
头文件:#include<stdio.h>
函数定义:int fflush(FILE *stream);
函数说明:调用fflush()会将缓冲区中的内容写到stream所指的文件中去.若stream为NULL,则会将所有打开的文件进行数据更新。
fflush(stdin):刷新缓冲区,将缓冲区内的数据清空并丢弃。
fflush(stdout):刷新缓冲区,将缓冲区内的数据输出到设备。