当前位置:   article > 正文

C语言与Linux系统文件操作函数大全_linux c语音 open 二进制文件

linux c语音 open 二进制文件

目录

一、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。

例子:

  1. FILE* fp = fopen("bite.txt","wb+");
  2. if(fp == NULL){
  3. perror("open");
  4. return -1;
  5. }

二、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。

例子:

  1. 23 const char* data = "Linux so easy!";
  2. 24 size_t ret = fwrite(data,sizeof(char),strlen(data),fp);
  3. 25 if(ret != 1){
  4. 26 printf("fwrite error\n");
  5. 27 return -1;
  6. 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判断文件结尾。

例子:

  1. 32 char buf[1024];
  2. 33 size_t _ret = fread(buf,sizeof(char),sizeof(buf)-1,fp);
  3. 34 if(_ret == 1){
  4. 35 printf("%s\n",buf);
  5. 36 }
  6. 37 else{
  7. 38 if(ferror(fp)){
  8. 39 printf("fread error\n");
  9. 40 }
  10. 41 else if(feof(fp)){
  11. 42 printf("end of file\n");
  12. 43 }
  13. 44 return -1;
  14. 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:追加写入

可以组合使用,用 | 组合。

例子:

  1. 19 int fd = open("./bite.txt",O_RDWR | O_CREAT,0664);
  2. 20 if(fd < 0){
  3. 21 perror("open");
  4. 22 return -1;
  5. 23 }

返回值:

返回一个整数文件描述符fd,>0 打开成功;<0 打开失败。

2、Linux系统——write接口

write接口向打开的文件中写入数据。

参数:

第一个参数fd:文件描述符,代表要写入的文件;第二个参数buf,要写入的数据缓冲区,注意void*,按字节写入;第三个参数count,要写入的字节数。

 返回值:

写入成功,返回写入的字节数;失败,返回-1.

例子:

  1. 5 const char* data = "i like Linux!";
  2. 26 ssize_t ret = write(fd,data,strlen(data));
  3. 27 if(ret == -1){
  4. 28 printf("write error\n");
  5. 29 return -1;
  6. 30 }

3、Linux系统——read接口

read接口读取文件中的数据放到缓冲区。

参数:

第一个参数fd:文件描述符,代表要读取的文件;第二个参数buf,要放入数据的缓冲区,注意void*;第三个参数count,字节数。

 返回值:

读取成功,返回读到的字节数;失败,返回-1;到达文件结尾返回0

例子:

  1. 34 char buf[1024];
  2. 35 ssize_t _ret = read(fd,buf,strlen(buf)-1);
  3. 36 if(_ret == 0){
  4. 37 printf("end of file\n");
  5. 38 return -1;
  6. 39 }
  7. 40 else if(_ret < 0){
  8. 41 perror("read error\n");
  9. 42 return -1;
  10. 43 }
  11. 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);

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/182995
推荐阅读
相关标签
  

闽ICP备14008679号