一、什么是流?
在讲之前,我们得先将一下流(英文为stream),数据从设备读入内存和数据从内存写入磁盘的过程很像是数据在流动一样,所以就“形象” 地把这个过程称为“流” 我们平常使用scanf对程序中的变量进行赋值的时候就是用到了标准输入流,通过printf将内容打印到屏幕上时则是用到了标准输出流,而在c语言中,程序一旦运行起来就会自动的帮你打开三个流,标准输入流(stdin),标准输出流(stdout)和标准错误流(stderr) 所以也从来没有什么打开键盘,关闭键盘这种操作。但程序在编译的时候它总不能知道你要打开什么文件吧,因此我们需要自己打开所需要的文件,并在用完之后关闭。
二、文件的打开和关闭
1.认识fopen和fclose
函数定义均取自cplusplus.com - The C++ Resources Network
fopen函数的作用为打开文件,它有两个参数,两个都是指针指向内容不可修改的字符型指针, 在使用它的时候传的第一个参数是文件的名字,第二个参数是打开的方式。它返回的值为你打开文件所在的地址。如果文件打开失败它会返回一个空指针(NULL)。
fclose函数的作用为关闭文件,参数为一个文件指针,传参的时候就将你要关闭的那个文件的地址(通过fopen函数获得的那个地址)传过去就行 (其实本质是传对应的流过去,但这么说太抽象了) 它就会帮你关闭文件,如果关闭成功它会返回0,否则返回EOF(-1)
2.不同的打开方式
取自比特就业课
3.使用fopen和fclose
#include<stdio.h> int main() { FILE*a=fopen("abcd.txt", "r"); //以只读的方式打开当前目录下名叫abcd.txt的文件 //并通过文件指针a接收地址 if (a == NULL) { perror("fopen");//错误提示 } fclose(a);//将打开的文件关闭 a = NULL;//将野指针置为空指针 }
在我的文件夹中现在是没有一个叫做abcd.txt的文件的也就是说,这一次打开注定是失败的,我们来试一下
果然失败了,接下来我们试一下,用w的模式来打开文件,因为w的模式在文件不存在的时候也会创建一个文件
#include<stdio.h> int main() { FILE*a=fopen("abcd.txt", "w"); //以只写的方式打开当前目录下名叫abcd.txt的文件 //并通过文件指针a接收地址 if (a == NULL) { perror("fopen");//错误提示 } fclose(a);//将打开的文件关闭 a = NULL;//将野指针置为空指针 }
运行没有问题,接下来就让我们看下目录中是否创建出了这么一个叫abcd.txt的文件
果然创建出来了,这不是在变魔术,也不是笔者自导自演,这是真实发生的,就是通过我们这个程序创建出来的。
三、文件的读写操作
1.fgetc和fputc
1.1认识fgetc和fputc
fgetc的作用是从对应流中取出字符来,并返回对应字符的ASCII值,读取失败则是会返回EOF,fputc则是将所给的字符传入到对应的流中,如果成功获得字符则其返回值为对应的字符。
1.2使用fgetc和fputc
在使用fgetc之前,我们先用fputc将一个字符写进文件中,这样才能使用fgets从非空的文件中读取字符。
#include<stdio.h> int main() { FILE* pf=fopen("abcd.txt","w"); //以只写的方式打开一个叫abcd.txt的文件如果文件不存在则创建该文件 if (pf == NULL) { perror("fopen"); return 1; } fputc('a',pf); //将字符a放进名字叫abcd.txt的文件中 fclose(pf); pf=NULL; }
可以看出,在运行程序之前abcd.txt这个文件中是什么都没有的,让我们运行一下
运行结束之后,a字符确实写进了abcd.txt这个文件中。
接着我们试一下fgetc,试着从流中拿字符出来,并赋值给程序中的一个变量,要注意的是fgetc在读取完字符后会自动地将文件的指针指向所读取字符的下一个字符 我们可以通过代码演示一下,这串代码的意义是从pf所指向的文件指针的内容中读取四个字符,并将它们依次打印出来。为此,我们先在abcd.txt这个文件中写一些字符,以免到时读取不到四个字符
代码如下:
#include<stdio.h> int main() { FILE* pf = fopen("abcd.txt", "r"); //以只读的方式打开一个叫abcd.txt的文件 //如果文件不存在则报错 if (pf == NULL) { perror("fopen");//错误警告 return 1; } char ch=fgetc(pf); //从pf所指向的流(文件)中读取一个字符并赋给ch //要注意的是,当fgetc读取完字符后它会自动地将文件指针指向文件中的下一个字符 //也就是说,你在下一次读取字符的时候会直接读到下一个字符 printf("%c\n", ch); //将ch从流中读取的数据打印出来 ch = fgetc(pf); printf("%c\n", ch); ch = fgetc(pf); printf("%c\n", ch); ch = fgetc(pf); printf("%c\n", ch); fclose(pf);//关闭文件 pf = NULL;//将野指针置为空指针 }
运行结果如下:
果然依次读出了4个字符。