一、为什么使用文件程序运行时数据存于内存程序退出内存回收数据丢失 文件可以把数据持久化存储到磁盘下次运行程序仍可读取历史数据。二、文件基础概念1. 文件分类按功能程序文件源文件.c目标文件Windows 下.obj可执行程序Windows 下.exe数据文件本章核心讲解对象 存储程序读写的数据用来存放输入 / 输出内容区别于键盘、显示器终端交互。2. 文件名完整格式文件路径 文件名主干 文件后缀示例c:\code\test.txt日常简称文件名。3. 文本文件 vs 二进制文件按数据存储形式二进制文件内存中二进制数据不做任何转换直接存入外存。 例int a10000二进制存储仅占 4 字节。文本文件数据全部转为 ASCII 字符再存储数值会拆分成单个字符。 例int a10000ASCII 存储占 5 字节1,0,0,0,0。存储规则字符统一 ASCII 存储数值ASCll或二进制存储。三、流、标准流与文件指针1. 流的概念我们程序的数据需要输出到各种外部设备也需要从外部设备获取数据不同的外部设备的输⼊输出操作各不相同为了⽅便程序员对各种设备进⾏⽅便的操作我们抽象出了流的概念我们可以把流想象成流淌着字符的河。C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。⼀般情况下我们要想向流⾥写数据或者从流中读取数据都是要打开流然后操作。2. 三大标准流程序启动自动打开无需手动 fopen类型均为FILE*文件指针stdin标准输入流 → 键盘scanf读取stdout标准输出流 → 显示器printf输出stderr标准错误流 → 显示器打印错误信息3. 文件指针 FILE*打开文件时系统在内存创建FILE 结构体文件信息区存储文件名、读写位置、文件状态等不同编译器结构体细节略有差异。FILE* pf指针指向该 FILE 结构体通过指针间接操作对应文件。四、文件打开与关闭1. 核心函数打开FILE* fopen(const char* filename, const char* mode);关闭int fclose(FILE* stream);规范打开文件后必须判断指针是否为 NULL打开失败使用完毕必须关闭文件释放资源 刷新缓冲区。2. 打开模式大全模式类型功能文件不存在时r文本只读读取已有文件报错返回 NULLw文本只写清空原有内容写入创建新文件a文本追加在文件末尾写创建新文件rb二进制只读二进制文件报错wb二进制只写二进制文件创建新文件ab二进制二进制末尾追加创建新文件r文本可读可写原有文件报错w文本可读可写新建清空创建a文本可读末尾追加写创建rb二进制二进制读写原有报错wb二进制二进制读写新建清空创建ab二进制二进制可读末尾追加创建3. 基础示例如图所示因为要打开的文件就在目前代码所在的路径上面所以可以只写文件名int main() { FILE* pf fopen(test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } return 0; }但如果要打开别的路径上面的文件就得写全比如我们想要打开桌面上的text.txt文件int main() { //绝对路径 FILE* pf fopen(C:\\Users\\Edbsee\\Desktop\\test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } return 0; }有一种简便写法如果想要打开的文件不在目前所在代码的路径上而是在上一级路径我们可以用.表示.表示当前路径..表示上一级路径如下代码就是在当前文件所在路径的上一级路径上打开test.txt文件int main() { FILE* pf fopen(./../test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } return 0; }最后我们要关闭文件再让指针指向NULL避免野指针int main() { FILE* pf fopen(./../test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } fclose(pf); pf NULL; return 0; }
C 语言文件操作(上)
一、为什么使用文件程序运行时数据存于内存程序退出内存回收数据丢失 文件可以把数据持久化存储到磁盘下次运行程序仍可读取历史数据。二、文件基础概念1. 文件分类按功能程序文件源文件.c目标文件Windows 下.obj可执行程序Windows 下.exe数据文件本章核心讲解对象 存储程序读写的数据用来存放输入 / 输出内容区别于键盘、显示器终端交互。2. 文件名完整格式文件路径 文件名主干 文件后缀示例c:\code\test.txt日常简称文件名。3. 文本文件 vs 二进制文件按数据存储形式二进制文件内存中二进制数据不做任何转换直接存入外存。 例int a10000二进制存储仅占 4 字节。文本文件数据全部转为 ASCII 字符再存储数值会拆分成单个字符。 例int a10000ASCII 存储占 5 字节1,0,0,0,0。存储规则字符统一 ASCII 存储数值ASCll或二进制存储。三、流、标准流与文件指针1. 流的概念我们程序的数据需要输出到各种外部设备也需要从外部设备获取数据不同的外部设备的输⼊输出操作各不相同为了⽅便程序员对各种设备进⾏⽅便的操作我们抽象出了流的概念我们可以把流想象成流淌着字符的河。C程序针对⽂件、画⾯、键盘等的数据输⼊输出操作都是通过流操作的。⼀般情况下我们要想向流⾥写数据或者从流中读取数据都是要打开流然后操作。2. 三大标准流程序启动自动打开无需手动 fopen类型均为FILE*文件指针stdin标准输入流 → 键盘scanf读取stdout标准输出流 → 显示器printf输出stderr标准错误流 → 显示器打印错误信息3. 文件指针 FILE*打开文件时系统在内存创建FILE 结构体文件信息区存储文件名、读写位置、文件状态等不同编译器结构体细节略有差异。FILE* pf指针指向该 FILE 结构体通过指针间接操作对应文件。四、文件打开与关闭1. 核心函数打开FILE* fopen(const char* filename, const char* mode);关闭int fclose(FILE* stream);规范打开文件后必须判断指针是否为 NULL打开失败使用完毕必须关闭文件释放资源 刷新缓冲区。2. 打开模式大全模式类型功能文件不存在时r文本只读读取已有文件报错返回 NULLw文本只写清空原有内容写入创建新文件a文本追加在文件末尾写创建新文件rb二进制只读二进制文件报错wb二进制只写二进制文件创建新文件ab二进制二进制末尾追加创建新文件r文本可读可写原有文件报错w文本可读可写新建清空创建a文本可读末尾追加写创建rb二进制二进制读写原有报错wb二进制二进制读写新建清空创建ab二进制二进制可读末尾追加创建3. 基础示例如图所示因为要打开的文件就在目前代码所在的路径上面所以可以只写文件名int main() { FILE* pf fopen(test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } return 0; }但如果要打开别的路径上面的文件就得写全比如我们想要打开桌面上的text.txt文件int main() { //绝对路径 FILE* pf fopen(C:\\Users\\Edbsee\\Desktop\\test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } return 0; }有一种简便写法如果想要打开的文件不在目前所在代码的路径上而是在上一级路径我们可以用.表示.表示当前路径..表示上一级路径如下代码就是在当前文件所在路径的上一级路径上打开test.txt文件int main() { FILE* pf fopen(./../test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } return 0; }最后我们要关闭文件再让指针指向NULL避免野指针int main() { FILE* pf fopen(./../test.txt, r); if (pf NULL) { perror(fopen); return 1; } else { printf(打开文件成功); } fclose(pf); pf NULL; return 0; }