ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

深度剖析 —— 文件操作

深度剖析 —— 文件操作 系列文章目录深度剖析数据深度剖析递归深度剖析结构体深度剖析动态内存管理深度剖析文件操作深度剖析预处理文章目录系列文章目录前言一、示例问题通讯录的信息存储1.通讯录的需求二、文件的存储1.标准 I/O2.文件分类3.文件类型4.文件缓冲区5.文件指针三、文件的打开与关闭1.文件的开关函数- fopen调用结构- fclose调用结构调用示例2.文件的打开方式四、文件的顺序读写1.字符输入输出fputc fgetc- fputc调用结构调用示例- fgetc调用结构调用示例2.文本行输入输出函数fputs fgets- fputs调用结构调用示例- fgets调用结构调用示例3.格式化输入输出函数fprintf fscanf- fprintf调用结构调用示例- fscanf调用结构调用示例4.二进制输入输出函数fwrite fread- fwrite调用结构调用示例- fread调用结构调用示例五、文件的随机读写与结束判定1.文件的随机读写- fseek调用结构- fwind调用结构2.文件的结束判定- feof调用结构总结前言文件是当今计算机系统十分重要的部分。文件用于存储程序、文档、数据、图形、照片、视频、书信、表格和许多其他种类的信息。作为程序员必须会编写创建文件和从文件读写数据的程序。本文将介绍相关的内容。一、示例问题通讯录的信息存储1.通讯录的需求通讯录需要一块可以保存信息的空间当需要时可随时调取我们常用的通讯录在使用之后可以将信息进行存储当我们再次需要调取信息时里面的内容依然存在这时我们就需要一个文件去存储相关信息。文件的内容不一定是程序而是程序运行时读写的数据比如程序运行需要从中读取数据的文件或者输出内容的文件。二、文件的存储1.标准 I/OI/O 的两个级别 (即处理文件访问的两个级别) 底层 I/Olow-level I/O使用操作系统提供的基本 I/O 。标准高级 I/Ostandard high-level I/O使用C库的标准包stdio.h头文件定义。标准 I/O 的优势标准 I/O 有许多专门的函数简化了处理不同 I/O 的问题。可移植性更好。输入和输出都是缓冲的。也就是说一次转移一大块信息而不是一字节信息通常至少512字节。拥有更高的数据传输速率。2.文件分类在程序设计中我们一般谈的文件有两种程序文件、数据文件程序文件:包括源程序文件后缀为.c目标文件windows环境后缀为.obj可执行程序windows环境后缀为.exe。数据文件:文件的内容不一定是程序而是程序运行时读写的数据比如程序运行需要从中读取数据的文件或者输出内容的文件。3.文件类型根据数据的组织形式数据文件被称为文本文件或者二进制文件文本文件:如果要求在外存上以ASCII码的形式存储则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。小明男11111某某大学![请添加图片描述](https://img-blog.csdnimg.cn/e0eb22cafa364885a826c550de69704a.png)二进制文件:数据在内存中以二进制的形式存储如果不加转换的输出到外存就是二进制文件。4.文件缓冲区ANSIC 标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的大小根据C编译系统决定的。5.文件指针缓冲文件系统中关键的概念是“文件类型指针”简称“文件指针”FILE*pf;//文件指针变量每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息如文件的名字文件状态及 文件当前的位置等。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的取名FILE。不同的C编译器的FILE类型包含的内容不完全相同但是大同小异。每当打开一个文件的时候系统会根据文件的情况自动创建一个FILE结构的变量并填充其中的信息使用者不必关 心细节。定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区是一个结构体变量。通过该文 件信息区中的信息就能够访问该文件。也就是说通过文件指针变量能够找到与它关联的文件。三、文件的打开与关闭1.文件的开关函数- fopen调用结构FILE*fopen(文件名.后缀,打开方式);返回一个指针需要判断是否为空指针- fclose调用结构intfclose(文件地址);关闭成功返回0否则返回EOF(-1)调用示例FILE*P_Filefopen(文件名.后缀,打开方式);if(P_FileNULL){perror(打开文件失败:);}fclose(P_File);2.文件的打开方式文件使用方式含义如果指定文件不存在“r”只读为了输入数据打开一个已经存在的文本文件出错“w”只写为了输出数据打开一个文本文件建立一个新的文件“a”追加向文本文件尾添加数据出错“rb”只读为了输入数据打开一个二进制文件出错“wb”只写为了输出数据打开一个二进制文件建立一个新的文件“ab”追加向一个二进制文件尾添加数据出错“r”读写为了读和写打开一个文本文件出错“w”读写为了读和写建议一个新的文件建立一个新的文件“a”读写打开一个文件在文件尾进行读写建立一个新的文件“rb”读写为了读和写打开一个二进制文件出错“wb”读写为了读和写新建一个新的二进制文件建立一个新的文件“ab”读写打开一个二进制文件在文件尾进行读和写建立一个新的文件四、文件的顺序读写1.字符输入输出fputc fgetc- fputc调用结构intfputc(int,FILE*stream);向文件写入数据(从末尾开始写入)调用示例fputc(1,P_File);fputc(2,P_File);fputc(3,P_File);- fgetc调用结构intfgetc(FILE*stream);向文件读数据(从开头开始按顺序读读一次向后走一格)读取结束返回EOF正常读取返回ASCII码值调用示例intretfgetc(P_File);printf(%c,ret);2.文本行输入输出函数fputs fgets- fputs调用结构intfputs(constchar*str,File*stream);向文件写入数据(从末尾开始写入)调用示例fputs(abcdef\n,P_File);fputs(123456\n,P_File);- fgets调用结构char*fgets(char*str,intn,FILE*stream)读取数 n 包括/0的位置所以最多读 n - 1 个调用示例fgets(arr,5,P_File);printf(%s\n,arr);fgets(arr,20,P_File);printf(%s\n,arr);3.格式化输入输出函数fprintf fscanf- fprintf调用结构intfprintf(File*stream,后面与printf一致);向文件写入数据(从末尾开始写入)调用示例fprintf(P_File,%s\n,hello world!);- fscanf调用结构intfscanf(File*stream,后面与scanf一致);读取(从开始位置)调用示例fscanf(P_File,%s,arr);printf(%s\n,arr);4.二进制输入输出函数fwrite fread- fwrite调用结构intfwrite(要写入的元素的地址,每个元素的大小,元素的数量,File*stream);以二进制的方式写入(字符串以二进制和文本写入结果一样)调用示例fwrite(arr,sizeof(char),20,P_File);- fread调用结构intfread(要读取的元素的地址,每个元素的大小,元素的数量,File*stream);返回读取到的完整元素的个数如果读取到的个数 实际要读的个数则为最后一次读取调用示例fread(arr,sizeof(char),20,P_File);五、文件的随机读写与结束判定1.文件的随机读写- fseek调用结构intfseek(文件,偏移量,偏移的起始位置);确定书写的位置SEEK_CUR - 当前位置SEEK_SET - 开头位置SEEK_END - 结尾位置(当指向结尾时偏移量只能为负)- fwind调用结构intfwind(文件);让文件指针回到起始位置2.文件的结束判定- feof调用结构intfeof(文件地址);是判断读取失败结束还是遇到文件结尾结束文本文件读取是否结束判断返回值是否为EOF或者是否为NULL等。每个函数有每个特定的结束标志。二进制文件的读取结束判断判断返回值是否小于实际要读的个数。总结对于大多数的程序而言文件的相关操作必不可少。标准 I/O 包自动创建输入和输出缓冲区以加快数据传输。多种输入输出方式使得程序更加灵活便捷大大提高了程序的效率同时也兼具良好的可移植性。
返回列表