大一开了c语言课时,一直到最后我都是没有接触过文件操作的,那时马上要结课了,老师讲的也特别快,所以了解程度也不是太高,所以也觉得需要进行一下总结:
闲话也就不多说了,进入正题,
对于文件,我想概念不需要我们来多说了,在这里我们叙述一下c语言中对文件操作的流程:
首先,我们要打开文件,然后要读写文件,然后我们要关闭文件。
1.文件操作相关基础
关于流:
流是一个抽象出来的东西,流指的是一种信息转换,就是从外界接收或者接受数据。在这里要提一个叫做缓冲区的概念,缓冲区就是一个临时存储区,这个区进行数据的传输,完成高速部件和低速部件之间的数据传输。大部分流都是可以完全缓冲的。
接下来我们说一下所提供的至少三个流—标准输入流(stdin)、标准输出流(stdout)、标准错误(stderr)。这些都是一个指向file结构的一个指针。
对于file结构,就是我们所说的文件指针,这个指针可以指向一个文件,然后你就可以对这个文件进行后续的操作。
stdin:标准输入流,所说的就是输入的来源,一般 指键盘;scanf()、getchar() 等函数默认从 stdin 获取输入。
stdout:标准输出流,一般指显示器;printf()、putchar() 等函数默认向 stdout 输出数据。
stderr:一般指显示器:比如perror()等函数向stderr输出数据。
perror()函数:这个函数是用来简化向用户报告特定错误的过程。
函数原型:
void perror(char const *message);
这个函数如果message不是null并且指向一个非空的字符串,perror函数就打印出这个字符串,后面跟一个分号和一个空格。然后打印出一条当前错误代码的解释信息。
例如下面这个程序,我在这里没有这个文件,所以打开肯定会出错的。
#include #include int main() { file *pread = fopen("test.txt", "r"); if (pread == null) { perror("没有这个文件"); } system("pause"); }
所以最后的输出是下面这样的。
2.打开文件与关闭文件
上面咱们已经说了要操作文件,首先要打开文件,所以接下来咱们对打开文件这个操作进行讲述一下。
打开文件:
fopen()函数
file *fopen(char *filename, char *mode);
这里的filename就是文件名,mode就是所说的访问方式。
这个函数,就是用来打开文件的函数。这个函数可以打开文件流,在这要注意,程序为必须同时处于活动状态的每一个文件声明一个指针变量,这个指针类型是file *,是一个文件指针。接下来对这个流进行操作,这时,你必须给出所要访问文件的访问方式,只有打开了这个文件,进行访问了,才能进行你接下来的常规操作,最后一定要记得使用fclose()函数关闭文件流。这样就可以防止一个流与和它相关联的文件再次被访问了,也保证了在缓冲区的数据都能被正确地写入文件。
比如我现在要对文件test.txt进行可写的操作状态。
file *pwrite=fopen("test.txt","w");
这里首先说一下访问方式:
文件打开方式由r、w、a、t、b、+ 六个字符拼成,各字符的含义是:
r:读
w:写
a:追加
t:文c/c++开发分享关于C语言中的文件操作件
b:二进制文件
+:读和写
另外需要注意的是一般如果你打开失败的话,你的文件指针就会变成一个空指针,我们很多时候会利用这个来看文件是否打开成功。当然,如果打开失败,它返回的就是一个file结构的地址。
关闭文件:
fclose()函数
fclose(file *f);
关闭文件流,这个函数在文件关闭之前会刷新缓冲区。如果它执行成功,那么fclose返回零值,如果失败,返回eof。
3.关于字符
关于字符i/o,在我们进行文件操作,最简单的就是进行字符的操作,字符操作会牵扯一些函数,我们来看一下这些函数。
getchar()函数家族
int fgetc(file *stream); int getc(file *stream); int getchar(void);
首先明确,这些函数都是用来读取字符,他们的返回值都是int,为什么不返回char类型呢,主要是为了允许函数报告文件结尾。
这三个函数的区别是getchar函数始终都是从标准输入流中进行读取。fgetc函数和getc函数都是从文件流中读取。
putchar()函数家族
int fputc(int character,file *stream); int putc(int character,file *stream); int putchar(int character);
前两个函数进行对文件流操作,第一个参数是要被打印的字符。打印之前,整形参数会转化为无符号整形字符型。putchar是对标准输出流操作,只打印一个字符。
ungetc()函数
int ungetc(int character,file *stream);
这个函数是用来把先前读入的字符返回到流中,这样它可以在以后重新被读入。
4.关于字符串
使用字符读取进行文件操作,效率太低,所以我们也就不得不考虑使用字符串的操作。
gets()函数家族
char *fgets(char *buffer,int buffer_size,file *stream); char *gets(char *buffer);
buffer指的是你要读取字符以后保存的缓冲区,这个缓冲区你自己来设定,比如一个字符数组。buffer_size指的是所读取的个数,最后是你要读取的文件流。
注意,fgets读取到的字符串会在末尾自动添加 ‘