一.文件使用的原因及定义1.原因如果没有文件我们写的数据是存储在电脑的内存中的如果程序流失内存回收数据就丢失了等再次运行程序是看不到上次的数据的如果想将数据进行持久化保存就要使用文件。2.定义磁盘上的文件是文件文件一般被分为两种程序文件和数据文件文件操作主要涉及。程序文件:包括源文件.c目标文件.obj可执行程序.exe等。注意后缀是windows环境。数据文件:这个章节主要讨论的就是数据文件文件的内容不一定是程序而是程序运行时读写的数据比如程序运行时需要从中读取数据的文件或者输出内容的文件。以前所处理的数据的输入输出都是以终端为对象的即从终端的键盘输入数据运行结果显示到显示器上其实有时后我们会把信息输入到磁盘上当需要的时候再把磁盘上的数据读取到内存中使用这里处理的就是磁盘上文件。3.文件名:文件名路径 文件名主干 文件后缀二.二进制文件和文本文件根据数据的组织形式数据文件被分为二进制文件和文本文件。数据在内存中存储如果不加转换输出到外存的文件中就是二进制文件如果在外存上要求以ASCII码的形式存储则需要在存储前以ASCII码的形式存储的文件就是文本文件。三.文件的打开和关闭1.文件操作步骤:(1)打开文件 2读/写文件 3关闭文件2.流程序的数据需要输出到外部的各种设备也需要从外部获取数据为了方便操作流的概念被提出我们可以把流想象成流淌着字符的河C语言程序针对键盘画面文件的数据输入输出操作都是通过对流操作的。一般情况下我们不论是向流中读取数据还是写数据都是需要打开流然后操作。外部设备 -- 流 (输入到)--- 程序 --(输出到)流 -- 外部设备3.标准流为什么从键盘输入数据向屏幕上输出数据为什么没有打开流呢那是因为C语言程序在默认启动的时候就默认打开了三个流。1stdin - 标准输入流 程序读取输入数据的通道。默认来源:键盘C语言对应scanf()函数就是从标准流中读取数据。2stdout - 标准输出流程序正常打印信息的通道。默认来源终端屏幕C语言对应printf函数就是将信息输出到标准输出流中。3stderr - 标准错误流大多环境中输出到显示器界面。这三个流的类型是FILE* - 文件指针C语言中文件指针可以维护流的各种操作。四.文件指针每个内使用的文件都会在内存中开辟文件信息区例如文件的名字状态当前的位置等这些信息都存储在一个结构体变量中该结构体是由系统声明的取名FILE。每当打开一个文件的时候系统会根据文件自动创建一个FILE*类型的变量。定义:FILE* pf -- 文件指针变量定义一个文件指针变量可以使pf指向某个文件的文件信息区是一个结构体变量通过该文件信息区就能够访问该文件也就是说通过文件指针变量能够间接找到与它关联的文件。五.文件的打开和关闭文件在读写文件之前应该打开文件再读写后应该关闭文件。1.打开文件:fopen函数函数原型FILE* fopen(const char* Filename,const char* mode)。2.关闭文件:fclose函数函数原型int fclose(FILE* stream)。3.fopen函数中mode对应的打开文件的操作方式1.r - 只读-为了读取数据打开一个已经存在的文本文件。2. w - 只写 - 为了输出数据打开一个文版文件3.a - 追加 - 向文本文件尾添加数据。若指定的文件报错用r会报错用w和r会建立一个新的文件。六.文件的顺序读写1.fputc:向输出流中写入一个字符适用于所有输出流。函数原型int fputc(int character,FILE* stream)参数character - 被写入的字符。stream - 是一个FILE* 类型的指针只想输出流通常是文件或stdout.代码演示#include stdio.h #include stdlib.h int main() { FILE* pf fopen(test3.txt, w); if (pf NULL) { perror(fopen); return 1; } for (char ch a; ch z; ch) { fputc(ch, pf); } //关闭文件 fclose(pf); pf NULL; }#include stdio.h #include stdlib.h int main() { for (char ch a; ch z; ch) { fputc(ch, stdout); } return 0; }2.fgetc向输入流中读取一个字符适用于所有输入流。函数原型int fgetc(FILE* stream)参数stream - FILE* 类型的文件指针可以是stdin(键盘也可以是其他输入流的指针如果是stdin就读取标准输入流的数据如果是文件读取的就是文件的数据。代码演示#include stdio.h #include stdlib.h int main() { FILE* pf fopen(test.txt, r); if (pf NULL) { perror(fopen); return 1; } int ch fgetc(pf); printf(%c\n, ch); fclose(pf); pf NULL; return 0; }#include stdio.h #include stdlib.h int main() { FILE* pf fopen(test.txt,r); if (pf NULL) { perror(fopen); return 1; } //读文件 int ch 0; while ((ch fgetc(pf)) ! EOF) { printf(%c,ch); } //关闭文件 fclose(pf); pf NULL; return 0; }3.feof检测stream指针指向的流是否遇到文件末尾。函数原型int feof(FILE* stream)4.ferror:检测stream指针指向的流是否发生读/写错误。函数原型int ferror(FILE* stream)5.fputs:想输出流中写入一个字符串适用于所有输出流。函数原型int fputs(const char* str,FILE* stream)参数str - 指针指向要写入的字符串要以\0结尾。stream - 是一个FILE* 指针指向要被写入的字符串。代码演示#include stdio.h #include stdlib.h int main() { FILE* pf fopen(test4.txt,w); if (pf NULL) { perror(fopen); return 1; } fputs(Hello , pf); fputs(GNSS, pf); fclose(pf); pf NULL; return 0; }6.fgets想输入流中读取一个字符串,适用于所有输入流。函数原型char* fgets(char* str,int num,FILE* stream)参数str - 指向字符数组的指针str只想的空间用于存储读取到的字符串。num - 最大读取字符数包括\0实际最多读取num - 1个。stream输入流的文件指针。代码演示#include stdio.h #include stdlib.h int main() { FILE* fp fopen(test4.txt,r); if (fp NULL) { perror(fopen); return 1; } //读文件 char arr[20] -----------; while (fgets(arr, 20, fp) ! NULL) { printf(%s,arr); } fclose(fp); fp NULL; return 0; }