4.fscanf和fprintf
4.1认识fscanf和fprintf
fscanf的作用是将流中的数据以格式的方式输入到程序中,它有一个变量为流,另一个带...的则是参数个数不定的意思,scanf,printf函数也同样是参数个数不定的。
fprintf的作用则是将程序中的数据以格式的方式输出到流中,变量和fscanf一致。
4.2使用fscanf和fprintf
fscanf,fprintf的使用方式和scanf,printf非常相似,从变量上都可以看的出来,只是多了一个流的形式罢了,不过我可以这么跟你说,scanf,printf能做的事,fscanf和fprintf也能做,但fscanf和fprintf能做的事scanf和printf不一定可以做 因为scanf和printf仅仅只适用于标准输入流和标准输出流。而fscanf和fprintf则是可以适用于所有输入流和所有输出流。
上代码:
老样子,我们还是先使用fprintf将程序中的内容输出到文件中,文件依然清空
代码如下:
#include<stdio.h> int main() { FILE* pf = fopen("abcd.txt", "w"); //以只写的方式打开abcd.txt if (pf == NULL) { perror("fopen"); return 1; } int a = 3; int b = 10; fprintf(pf,"%d %d",a,b); //将a,b以int的方式输入到pf所指向的文件中 fclose(pf); pf = NULL; }
运行结果:
使用fwrite将流中的内容取出,并对程序中的变量进行修改。
文件内容如下:
代码如下:
#include<stdio.h> int main() { FILE* pf = fopen("abcd.txt", "r"); //以只读的方式打开abcd.txt if (pf == NULL) { perror("fopen"); return 1; } int a = 0; int b = 0; fscanf(pf, "%d %d", &a, &b); //将pf所指向的文件的内容以整型的方式输入到a,b中 printf("a的值为%d\nb的值为%d", a,b); fclose(pf); pf = NULL; }
运行结果如下:
四、什么才是输入输出?
有的小伙伴因为输入输出的问题会听的很难受,完全无法理解,这里笔者就来详细的叙述一下什么才是真正的输入输出。
在很多人眼中,输入输出仅仅限于打印在屏幕上是输出,在键盘上写东西是输入,这是浅薄的认识。在我们看来,scanf的作用是通过键盘对程序中的变量进行修改,这是输入。printf的作用是打印出我们想要的东西,是输出。gets的作用是从键盘上读取字符串,是输入。puts的作用是将字符串打印在屏幕上,是输出。这些理解都没有错,但是大部分这样理解的人久而久之就会错误地认为写东西就是输入,打印东西就是输出,这太片面了。在我们c语言编程中,输入输出是相对于程序而言的,我通过程序向外面(如屏幕)输送东西叫输出,我用外面的东西(如通过键盘输入字符)向程序输入东西叫输入 这个才是输入输出的真正含义,再举一个例子,我通过程序向文件中输送数据,这叫输出(而不是你们理解的输入),我通过读写文件中的内容,输送到程序中叫输入(而不是你们理解的输出),最后再强调一遍,输入输出是站在程序的角度看的。
五、文件的随机读写
1.fseek函数
1.1认识fseek函数
fseek函数的作用是将流指向位置拨动到你想要的位置,三个参数,一个是流,一个代表着你要的偏移量,一个代表着你要从哪里开始偏移,只有知道了你要从哪里开始偏移你才能够知道偏移量是多少,才能知道如何才能偏移到想要的位置。返回值类型为整型,在fseek正常使用的情况下它会返回0,出错的话则返回非0值。
偏移的位置一共有三种,SEEK_SET的含义是从文件开始的位置开始偏移,SEEK_CUR的意思是从当前的流的位置开始偏移,比方说我用fgetc对一个文件成功地取出了两个字符,这个时候偏移量为0时取一个,偏移量为1时再取一个,指针也因此在此时指向了偏移量为2的位置。我这时使用SEEK_CUE就会直接从文件的这个位置开始偏移。SEEK_END的含义则是从文件的最后开始偏移(指的是从最后一个字符开始偏移)
1.2使用fseek函数
在文件中存放一串字母
代码如下:
#include<stdio.h> int main() { FILE* pf = fopen("abcd.txt", "r"); //以只读的方式打开abcd.txt if (pf == NULL) { perror("fopen"); return 1; } fseek(pf,3,SEEK_SET); char ch=fgetc(pf); //从pf所指向的文件开头偏移3的位置处取一个字符出来,并赋给ch printf("%c", ch); fclose(pf); pf = NULL; }
运行结果如下:
果然取出了偏移量为3的字母d
2.ftell函数
2.1认识ftell函数
ftell函数的作用很简单,就是告诉你此时相对于最开始文件位置的偏移量是多少
2.2使用ftell函数
文件中放一串字母
代码如下:
#include<stdio.h> int main() { FILE* pf = fopen("abcd.txt", "r"); //以只读的方式打开abcd.txt if (pf == NULL) { perror("fopen"); return 1; } fseek(pf,-5,SEEK_END); //将指针从文件最后一个字符偏移-5 char ch = fgetc(pf); //取一个字符,偏移+1,偏移相对最后一个字符为-4 //根据文件内容可知此时偏移量为7 int a = ftell(pf); printf("偏移量为%d的字符为%c\n",a,ch); fseek(pf, 2, SEEK_CUR); //将指针从文件当前位置偏移2 ch = fgetc(pf); //取一个字符,偏移+1 //故此时偏移量为10 a = ftell(pf); printf("偏移量为%d的字符为%c\n", a, ch); fclose(pf); pf = NULL; }
运行结果如下:
和我们分析的一致。
3.rewind
3.1认识rewind函数
它的作用是将流的位置设置为开头
3.2使用rewind函数
还是用之前那个文件中的内容
代码如下:
#include<stdio.h> int main() { FILE* pf = fopen("abcd.txt", "r"); //以只读的方式打开abcd.txt if (pf == NULL) { perror("fopen"); return 1; } fseek(pf,-5,SEEK_END); //将指针从文件最后一个字符偏移-5 char ch = fgetc(pf); //取一个字符,偏移+1,偏移相对最后一个字符为-4 //根据文件内容可知此时偏移量为7 int a = ftell(pf); printf("偏移量为%d的字符为%c\n",a,ch); fseek(pf, 2, SEEK_CUR); //将指针从文件当前位置偏移2 ch = fgetc(pf); //取一个字符,偏移+1 //故此时偏移量为10 a = ftell(pf); printf("偏移量为%d的字符为%c\n", a, ch); rewind(pf);//将位置设置为开头 ch=fgetc(pf);//从开头取一个字符给ch printf("%c\n",ch); fclose(pf); pf = NULL; }
运行结果如下: