使用fopen等标准C库来操作文件

fopen

需要的头文件:

#include 

函数原型:

FILE *fopen(const char *pathname, const char *mode);

参数:

  • pathname: 文件路径
  • mode:
  • “r” :以只读方式打开文件,该文件必须存在。
  • “w” :打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
  • “a” :以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(EOF符保留)
  • “r+” :以可读写方式打开文件,该文件必须存在。
  • “w+” :打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
  • “a+”:以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。 (原来的EOF符不保留)
  • “rb” :只读打开一个二进制文件,只允许读数据。
  • “wb” :只写打开或建立一个二进制文件,只允许写数据。
  • “ab” :追加打开一个二进制文件,并在文件末尾写数据。
  • “rb+” :读写打开一个二进制文件,允许读写数据,文件必须存在。
  • “wb+” :读写打开或建立一个二进制文件,允许读和写。
  • “ab+” :读写打开一个二进制文件,允许读,或在文件末追加数据。
  • “rt” :只读打开一个文本文件,只允许读数据。
  • “wt” :只写打开或建立一个文本文件,只允许写数据。
  • “at” :追加打开一个文本文件,并在文件末尾写数据。
  • “rt+” :读写打开一个文本文件,允许读和写。
  • “wt+” :读写打开或建立一个文本文件,允许读写。
  • “at+” :读写打开一个文本文件,允许读,或在文件末追加数据。

打开方式总结:

① 打开是否为二进制,用“b”标识;

② 读写方式有以下几种:只读、只写、读写、追加只写、追加读写。

③ 对文件是否必须存在,以及存在时是清空还是追加会有不同的响应。具体判断如下图:

参考:fopen函数mode参数详解_fopen mode_allinallinallin的博客-CSDN博客

  • 返回值:文件顺利打开后,指向该流的文件指针就会被返回,若文件打开失败则返回NULL。

fclose

 需要的头文件:

#include 

函数原型:

 int fclose(FILE *stream);

参数:

  • stream: 文件指针(也就是fopen成功之后返回的指针

fread 和 fwrite

 需要的头文件:

#include 

函数原型:

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

参数:

  • ptr: 指向“数据读取到之后存储到的缓存区”/“要写入的数据存放的缓存区”的指针
  • size: 读取/写入 的 基本单元 字节大小 , 单位是字节 , 且一般是缓冲的单位大小
  • 如果缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
  • 如果缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;
  • nmemb: 读取/写入 的 基本单元 个数
  • stream: 文件指针
  • 返回值 : 实际从文件中读取/写入的 基本单元 个数 ; 读取/写入的字节数是 基本单元数 * 基本单元字节大小 
  • 对于写write:哪怕size设置基本单元的大小是100个char,但是nmemb设置了1,那么返回值就是1, 返回值严格跟随nmemb的值,但是当缓冲区的数据已经全部写完的时候,就不会再继续增加内容了,只不过进行无意义的写操作使得最后写的次数等于nmemb
  • 对于读read,同样返回值大部分情况下跟随nmemb的值,除了:当给出的读取缓存区已经已经读满了或者已经没东西可读了,那么就不会再读了,并且返回已经读的基本单元个数

fseek

 需要的头文件:

#include 

函数原型:

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

参数:

  • stream: 文件指针
  • offset: 偏移量
  • whence: SEEK_SET(头)或 SEEK_CUR(当前) 或 SEEK_END(尾)
  • 返回值:如果执行成功 , 则返回 0 , 失败返回非 0 , 并设置 error 错误代码

实操演示

demo9.c:

#include 
#include 
#include 


int main()
{
	FILE *fp;
	char *write_buf = "mjmmm";
	char *read_buf;

	fp = fopen("./mjm.txt","w+");
	
	int count = fwrite(write_buf, sizeof(char), strlen(write_buf),fp);
	// fwrite(write_buf, sizeof(char)*strlen(write_buf), 1,fp);
	printf("%d bytes has been written\n",count);
	
	fseek(fp,0,SEEK_SET);
	
	read_buf = (char *)malloc(sizeof(char)*count);
	fread(read_buf, sizeof(char),strlen(write_buf),fp); //注意此时第三个参数不能使用 strlen(read_buf), 因为read_buf中没有任何有效参数,所以会是0
    //fread(read_buf, sizeof(char)*strlen(write_buf),1,fp);
	printf("context:%s\n",read_buf);

	fclose(fp);

	return 0;
}

运行代码:

打开mjm.txt:

使用fopen等标准C库来操作文件_第1张图片

 

你可能感兴趣的:(c语言,开发语言,linux,系统编程)