注:输入输出是站在内存的角度来看的
一文件顺序读写函数介绍
1.字符输入函数fgetc(适用于所有输入流)
参数为文件指针,是从文件中读取一个字符,并将该字符的ASCII码值返回,读取完后文件指针指向文件中的下一个字符,当然最开始是指向文件中的第一个字符。
2.字符输出函数fputc(适用于所有输出流)
字符输出是从内存输出一个字符到文件中,所以参数1是输入字符的ASCII码值,参数2是输入的目的——文件指针指向的文件,返回值为输出的字符
3.文本行输入函数fgets(适用于所有输入流)
从FILE*指针指向的文件中读取num个字符复制到char*str的位置处,若是文件中一行字符不够num, 也会停止读取,会在str末尾补\0,所以实际只读取了num-1个字符给str。
4.文本行输出函数fputs(适用于所有输出流)
将str指向的字符串复制到文件中去,同时我们还可以看到char*str用const修饰,这使得代码更严谨,免得出现我们将源字符串修改的情况。
5.格式化输入函数fscanf(适用于所有输入流)
将文件中的数据格式化读取到内存中,而const char*format的后面则是可变参数列表,这个可变参数列表,和printf参数是一样的,第一个为格式字符串参数,而后面的则为%d,%s提供数据的参数,由于这部分的参数数量未知,所以说是参数个数是可变的。还有就是下面格式字符串的两种形式是等价的,但是通常用偏复杂的第一种。
char arr6[20] = { "he is a boy" };
printf("hello world");
printf(arr6);
6.格式化输出函数fprintf(适用于所有输出流)
将参数按照格式输入到文件里。
7.二进制输出函数fwrite(只能用于文件)
参数1为输出数据的地址,参数2为输出数据中单个元素的大小,count为元素个数,最后一个参数为写入文件的地址。再这里我们可以看到参数1是用void*指针接收,这其实是为了函数的通用性,与qsort参数设计是类似的。
8.二进制输入函数fread(只能用于文件)
fread函数和fwrite函数参数是一样的,只是数据的起始地和目的地不同。
二函数对比:
(1)scanf和fscanf和sscanf
scanf和fscanf他们之间的区别在于适用范围,scanf是标准输入函数,只适用于标准输入流,而fscanf适用于所有输入流,要说清楚区别还要先解释一个概念——流,什么是流呢?数据上传到不同的设备的方式是不一样的,如果我们要上传数据,可能要学会上传到不同设备的方法,这会很麻烦,所以c语言抽象出流的概念,我们只需要将数据传到流上,系统会帮我们处理不同流到不同设备上。而printf和scanf是标准输出输入函数,这意味着printf只能把数据输出到标准输出流(标准输出流对应的设备就是我们的屏幕),scanf同样只能从标准输入流中(对应设备也就是我们的键盘)获取数据,fscanf适用于所有输入流,那说明fscanf也可以从标准输入流中读取数据,fprintf也可以将数据上传到标准输出流上。
int a = 0;
fscanf(stdin,"%d",&a);我把文件指针换成stdin这个标准输入流
printf("%d", a); 结果我们仍能打印出数字,这说明fscanf确实适用于所有输入流
并且说明文件指针实质维护的是文件流,但是该文件流不是默认打开的
所以要用fopen,不然文件这么多,难道都要默认打开
而键盘,屏幕却是默认打开的,所以我们可以直接用。
还有就是sscanf不是从某个流中读取数据,而是从某个字符数组中读取数据,使用如下,
char arr[20] = {"he is a boy"};
char arr1[10] = { 0 };
char arr2[10] = { 0 };
char arr3[10] = { 0 };
char arr4[10] = { 0 };
sscanf(arr, "%s %s %s %s", arr1, arr2, arr3, arr4);
printf("%s ", arr1);
printf("%s ", arr2);
printf("%s ", arr3);
printf("%s ", arr4);
(2)printf和fprintf和sprintf
其中printf和fprintf的区别也是适用范围,标准输出流为stdout,大家可以结合上述例子尝试用fprintf代替printf使用。而sprintf其实也就是与sscanf函数相反功能的函数, 将参数所给的数据按照格式输出到参数1指针指向位置处。(这两个函数在某些地方的使用我觉得是一样的,但此处区别十分明显)
char arr[20] = {"he is a boy"};
char arr1[10] = { 0 };
char arr2[10] = { 0 };
char arr3[10] = { 0 };
char arr4[10] = { 0 };
char arr5[20] = { 0 };
sscanf(arr, "%s %s %s %s", arr1, arr2, arr3, arr4);
printf("arr5之前的为:%s\n", arr5);
sprintf(arr5," %s %s %s %s", arr1, arr2, arr3, arr4);
printf("调用了sprintf后arr5变为:%s",arr5);
三文件随机读写函数(这块大家了解作用就好了)
(1)fseek
根据文件指针的位置和偏移量来定位文件指针
参数2是偏移量(向左为负,向右为正),参数3是位置,有如下选择1.seek_set(从文件指针初始位置调整): seek_cur(从当前文件指针位置): seek_end(从文件末尾位置调整)
(2)ftell(参数和rewind一样都是文件指针)
返回文件指针相对于起始位置的偏移量
(3)rewind
让文件指针回到文件的起始位置
以上就是所有我了解的文件函数,希望对大家有所帮助。