目录
一、C语言——fopen函数
二、C语言——fwrite函数
三、C语言——fread函数
四、C语言——fseek函数
1、Linux系统——open接口
2、Linux系统——write接口
3、Linux系统——read接口
4、Linux系统——lseek接口
一、C语言——fopen函数
fopen函数是C标准库提供的打开文件的函数。
有2个参数。
第一个是要打开的文件(包含路径)
第二个是打开方式。关于打开方式主要有以下这些::
r: 以只读方式打开文件,该文件必须存在。
r+:以读/写方式打开文件,该文件必须存在。
rb:以只读方式打开一个二进制文件,该文件必须存在。
rb+:以读/写方式打开一个二进制文件,该文件必须存在。
rt: 以只读方式打开一个文本文件,该文件必须存在。
rt+: 以读/写方式打开一个文本文件,该文件必须存在。
w: 以只写方式打开文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。
w+:以读/写方式打开文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。
wb:以只写方式打开一个二进制文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。
wb+:以读/写方式打开一个二进制文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。
wt:以只写方式打开一个文本文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。
wt+:以只写方式打开一个文本文件,若文件存在,则覆盖原内容;若文件不存在,创建该文件。
a: 以追加的方式打开只写文件,文件存在时写入数据到文件结尾;文件不存在创建该文件(EOF符保留)
a+:以追加的方式打开读/写文件,文件存在时写入数据到文件结尾;文件不存在创建该文件(EOF符不保留)
ab+:以追加的方式打开读/写的二进制文件...
at+: 以追加的方式打开读/写的文本文件...
返回值:
成功返回一个FILE pointer(文件指针),失败返回NULL。
例子:
FILE* fp = fopen("bite.txt","wb+");
if(fp == NULL){
perror("open");
return -1;
}
二、C语言——fwrite函数
size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream);
fwrite 和 fread函数既可操作文本文件,也可操作二进制文件。
fwrite是将ptr指针指向的数据写到文件流中。
参数:
有4个参数,第一个是ptr指针,指向要写出的数据的内存首地址;第二个是要写出的数据的基本单元大小以字节为单位(如:sizeof(char);第三个是基本单元个数;第四个是打开的文件指针。
返回值:
写入成功返回写入的基本单元个数,写入失败返回0,基本单元个数 != nmemb。
例子:
23 const char* data = "Linux so easy!";
24 size_t ret = fwrite(data,sizeof(char),strlen(data),fp);
25 if(ret != 1){
26 printf("fwrite error\n");
27 return -1;
28 }
三、C语言——fread函数
size_t fread(const void* ptr,size_t size,size_t nmemb,FILE* stream);
fwrite 和 fread函数既可操作文本文件,也可操作二进制文件。
fread是将文件流中的数据读取到缓冲区ptr。
参数:
第一个是指针ptr,指向缓冲区,第二个是要读取的数据的基本单元大小;第三个是基本单元个数;第四个是打开的文件指针。
返回值:
读取成功返回读取到的基本单元个数,若失败或者读到文件末尾返回0,个数<nmemb。
fread不区分文件结尾和读取错误,可以调用ferror判断错误以及用feof判断文件结尾。
例子:
32 char buf[1024];
33 size_t _ret = fread(buf,sizeof(char),strlen(buf)-1,fp);
34 if(_ret == 1){
35 printf("%s\n",buf);
36 }
37 else{
38 if(ferror(fp)){
39 printf("fread error\n");
40 }
41 else if(feof(fp)){
42 printf("end of file\n");
43 }
44 return -1;
45 }
四、C语言——fseek函数
fseek函数是用来重新定位流上的文件指针的。
参数:
第一个参数是文件流;第二个参数是偏移量,以第三个参数为基准偏移offset个字节位置。
whence为基准有3个:
SEEK_SET(0):文件开头
SEEK_CUR(1):文件当前位置
SEEK_END(2):文件结尾
offset是偏移量,正整数表示正向偏移,负整数表示负向偏移。
例子:fseek(fp,-1L ,SEEK_CUR) 调整文件指针,距文件当前位置-1个偏移量。
fseek(fp,100L,SEEK_END) 调整文件指针,距文件结尾100个偏移量。
返回值:
成功调整文件指针返回0,失败返回其他值,并且失败不改变文件指针指向。
1、Linux系统——open接口
open接口有2个,拿第二个来说。
参数:
第一个参数是文件名(包含路径),第二个参数是flags,是打开文件的方式,有一下几种:
O_WRONLY:只写 O_RDONLY:只读
O_RDWR:读写 O_CREAT:创建文件
O_TRUNC:已经存在文件清空内容 O_APPEND:追加写入
可以组合使用,用 | 组合。
例子:
19 int fd = open("./bite.txt",O_RDWR | O_CREAT,0664);
20 if(fd < 0){
21 perror("open");
22 return -1;
23 }
返回值:
返回一个整数文件描述符fd,>0 打开成功;<0 打开失败。
2、Linux系统——write接口
write接口向打开的文件中写入数据。
参数:
第一个参数fd:文件描述符,代表要写入的文件;第二个参数buf,要写入的数据缓冲区,注意void*,按字节写入;第三个参数count,要写入的字节数。
返回值:
写入成功,返回写入的字节数;失败,返回-1.
例子:
5 const char* data = "i like Linux!";
26 ssize_t ret = write(fd,data,strlen(data));
27 if(ret == -1){
28 printf("write error\n");
29 return -1;
30 }
3、Linux系统——read接口
read接口读取文件中的数据放到缓冲区。
参数:
第一个参数fd:文件描述符,代表要读取的文件;第二个参数buf,要放入数据的缓冲区,注意void*;第三个参数count,字节数。
返回值:
读取成功,返回读到的字节数;失败,返回-1;到达文件结尾返回0
例子:
34 char buf[1024];
35 ssize_t _ret = read(fd,buf,strlen(buf)-1);
36 if(_ret == 0){
37 printf("end of file\n");
38 return -1;
39 }
40 else if(_ret < 0){
41 perror("read error\n");
42 return -1;
43 }
44 fprintf(stdout,"%s\n",buf);
4、Linux系统——lseek接口
重新定位流上的文件指针。
参数与上文fseek几乎一致,不再赘述。
返回值:
off_t :指示文件偏移量,32位下为long类型,默认为32位整数,64位下为long long,64位整数。
成功返回从头部开始计算的位置偏移量(以字节为单位);错误返回-1 。
例子:
lseek(fd,0,SEEK_SET);