C语言的文件操作
将写的程序写入到文件当中,将文件中的代码导入到软件当中,内存和磁盘中的文件进行交互。
文件和流的介绍
文件最主要的作用就是 保存数据 ,它既可以保存一张图片,也可以保持视频,声音...。
C程序中,对于文件中数据的输入/输出操作以“ 流(stream) ” 的方式进行,可以看做是一种数据的流动。
输入流:从数据源(比如:文件)到程序(或内存)的流动过程;
输出流:从程序(或内存)到数据源(比如:文件)的流动过程。
C输入和输出
输入的来源:键盘。文件,或从网络中。
输出的目的地:屏幕上,打印机上或任意文件中显示或保存一些数据。
- 标准的文件I/O
标准文件 | 文件指针 | 设备 |
标准输入 | stdin | 键盘 |
标准输出 | stdout | 屏幕 |
标准错误 | stdout | 屏幕 |
scanf和printf函数 、getchar和putchar函数 、gets和puts函数 在发布的第二篇C语言文章关于变量的文件中详细说到。
C文件的读写
首先声明文件路径:
举例:char * filePath = "C:\\Users\\86182\\Desktop\\hello.txt";
-
创建/打开文件
FILE * fopen( const char * filename e , const char * mode);
filename是字符串,用来命名文件;访问模式 mode 的值可以是下列值中的一个。
模式 | 描述 |
r | 只读 。打开一个已有的文本文件,只允许读取。 |
w | 只写 。打开一个文本文件,只允许写入文件。如果文件 不存在,则会创建一个新文件, 并从文件的开头写入内容。如果文件存在,则截断文件为 零长度,从开始写入! |
a | 追加 。打开一个文本文件,用于写入。如果文件不存 在,则创建一个新文件。 如果文件已存在,则将写入的数据追加到文件末尾。 |
rb | 只读(二进制) 。打开一个二进制文件,只允许读取 |
wb | 只写(二进制) 。打开一个二进制文件,只允许写入。 如果文件不存在,则创建一个 新文件。如果文件已存在,则截断文件为零长度,从开始写入! |
ab | 追加(二进制) 。打开一个二进制文件,用于写入。如果文件不存在,则创建一个新文件。如果文件已存在,则将写入的数据追加到文件末尾。 |
模式 | 描述 |
r+ | 读写 。打开一个文本文件,允许读取和写入。 |
w+ | 读写 。打开一个文本文件,允许读取和写入。如果文件不存在,则创建一个新文件。 如果文件已存在,则截断文件为零长度,从开始写入! |
a+ | 读写 。打开一个文本文件,允许读取和写入。如果文件不存在,则创建一个新文件。 如果文件已存在,则将写入的数据追加到文件末尾。 |
rb+ | 或 "rb+" : 读写(二进制) 。打开一个二进制文件,允许读取和写入。 |
wb+ | 或 "wb+" : 读写(二进制) 。打开一个二进制文件,允许读取和写入。如果文件 不存在,则创建一个新文件。如果文件已存在,则截断文件为零长度。 |
ab+ | 或 "ab+" : 读写(二进制) 。打开一个二进制文件,允许读取和写入。如果文件 不存在,则创建一个新文件。如果文件已存在,则将写入的数据追加到文件末尾。 |
-
关闭文件
int fclose( FILE *fp );
说明:
- 如果成功关闭文件,fclose( ) 函数返回零。此时,会 清空缓冲区中的数据 ,关闭文件,并释放用于该文件的所有内存。
- 如果关闭文件时发生错误,函数返回 EOF。EOF 是一个定义在头文件 stdio.h 中的常量。
-
写入文件
方式1:fprintf函数
int fprintf(FILE *fp,const char * format, ...);
方式2:fputs函数
int fputs( const char *s , FILE *fp );
举例:
#include <stdio.h>
int main() {//创建一个文件指针FILE *fp = NULL;//打开该文件fp = fopen("d:/hello.txt", "w+"); //w+模式是:如果文件已存在,则截断文件为零长度。//fp = fopen("d:/hello.txt", "a+"); //a+模式是:如果文件已存在,则将写入的数据追加到文件末尾。//将内容写入到文件中fputs("你好,北京!!\n", fp);fprintf(fp, "你好,世界!!\n");//关闭文件!如果不关闭 ,我们的内容没有保存到文件中!fclose(fp);printf("创建,写入信息完成");return 0;
}
-
读取文件
其中声明文件路径、打开文件、关闭文件的操作和上面相同。因此这里只讲读取文件的方式。
方式1:fscanf函数
int fscanf (FILE *fp , const char *format, ... );
这种方式更适合:使用 fscanf() 函数从文件中读取格式化的数据,比如 整数、浮点数等各种类型的数据 。 format 参数指定了数据的格式,后面的参数是用于存储读取数据的变量。
注意:
- 如果使用 fscanf( ) 函数从文件中 读取字符串 ,会在遇到第一个空白字符(空格、制表符、换行符等)时,停止读取,之后的内容会被忽略。
- 它会返回 成功读取的参数个数 。或者在读取失败或文件结束时 返回 EOF 。
- 因此,这种方式不太适合对于字符串文本的读取。
方式2:fgets函数
先声明一个字符数组作为缓冲区:char* cBuff [10];
char * fgets( char *buf , int n , FILE *fp );
说明:
- 此函数按行读取数据,它从文件中 读取一行数据 (包括换行符'\n'),并将这一行的内容存储到指定的缓冲区中。参数中 buf 是用于存储读取的文本的缓冲区,n 是缓冲区的大小,fp 是文件指针。
- 如果成功读取,返回参数 buf,即读取到的字符串的首地址。如果到达文件末尾或者读取失败,返回NULL。
举例:
#include <stdio.h>
int main() {//创建一个文件指针FILE *fp = NULL;//定义一个缓冲区char buff[1024];//打开文件fp = fopen("d:/hell.txt", "r");//方法1//fscanf(fp, "%s", buff);//输出//printf("%s\n", buff); //这种输出遇到‘\0’,就会停止输出。//方法2 读取整个文件//说明,循环读取fp指向的文件内容,如果读到NULL,就结束while (fgets(buff, 1024, fp) != NULL) {printf("%s", buff);}//关闭文件fclose(fp);return 0;
}