🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 文件的顺序读写 按照字符读写文件fgetc,fputc ## 按照字符读写文件 ### 写文件fputc ~~~ #include<stdio.h> int fputc(int ch, FILE * stream); 功能: 将ch转换为unsigned char后写入stream指定的文件中 参数: ch: 需要写入文件的字符 stream: 文件指针 返回值: 成功: 成功写入文件的字符 失败: 返回-1 ~~~ 1. 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,并将写入的字符放在文件开头。如需保留原有文件内容,并把写入的字符放在文件末尾,就必须以追加方式打开文件。不管以何种方式打开,被写入的文件若不存在时则创建该文件。 2. 每写入一个字符,文件内部位置指针向后移动一个字节 ### 读文件fgetc ~~~ #include<stdio.h> int fgetc(FILE * stream); 功能: 从stream指定的文件中读取一个字符 参数: stream: 文件指针 返回值: 成功: 返回读取到的字符 失败: -1 ~~~ 在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。 注意:这个文件内部的位置指针与C语言中的指针不是一回事。位置指针仅仅是一个标志,表示文件读写到的位置,也就是读写到第几个字节,它不表示地址。文件每读写一次,位置指针就会移动一次,它不需要你在程序中定义和赋值,而是由系统自动设置,对用户是隐藏的 ### 文件结尾feof 在c语言中,EOF表示文件结束符,在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件.这种以EOF为结束标志的文件,必须是文本文件.在文本文件中,数据都是以字符的ASCII代码值的形式存放的.我们知道,ASCII代码值的范围是0~127,不可能出现-1,因此可以用eof作为文件结束标志 > EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现 ~~~ #define EOF(-1) ~~~ #### 对 EOF 的说明 EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回 EOF 时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror() 当把数据以二进制形式存放到文件中时,就会有-1值出现,因此不能采用EOF作为二进制文件的结束标志.为解决这一个问题,ASCII c 提供一个feof函数,用来判断文件是否结束.feof函数即可以用来判断二进制文件又可以用来判断文本文件 ~~~ #include<stdio.h> int feof(FILE * stream); 功能: 检测是否读取到了文件结尾.判断的是最后一次"读操作的内容",不是当前位置内容(上一个内容) 参数: stream: 文件指针 返回值: 非0值: 已经到文件结尾 0: 没有到文件结尾 ~~~ feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是: ~~~ int feof ( FILE * fp ); ~~~ 当指向文件末尾时返回非零值,否则返回零值。 ferror() 函数用来判断文件操作是否出错,它的原型是: ~~~ int ferror ( FILE *fp ); ~~~ 出错时返回非零值,否则返回零值。 需要说明的是,文件出错是非常少见的情况,上面的示例基本能够保证将文件内的数据读取完毕。如果追求完美,也可以加上判断并给出提示 ## 按照字符串读写文件 ### 写文件fputs 写入成功返回非负数,失败返回 EOF ~~~ #include <stdio.h> int fputs(const char * str, FILE * stream); 功能: 将str所指定的字符串写入到stream指定的文件中,字符串结束符'\0'不写入文件 参数: str: 字符串 stream: 文件指针 返回值: 成功: 0 失败: -1 ~~~ ### 读文件fgets fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中 ~~~ #include <stdio.h> char * fgets(char * str, int size, FILE * stream); 功能: 从stream指定的文件内读入字符,保存到str所指定的内存空间,直到出现换行字符,读到文件结尾或是已读了size-1个字符为止,最后会自动加上字符'\0'作为字符串结束 参数: str: 字符串,字符数组 size: 指定最大读取字符串的长度(size-1) stream: 文件指针 返回值: 成功: 成功读取的字符串,也就是首地址 失败: 读到文件尾或出错NULL ~~~ ## 按照格式化读写文件 ### 写文件fprintf ~~~ #include<stdio.h> int fprintf(FILE * stream, const char * format, ...); 功能: 根据参数format字符串来转换并格式化数据,然后将结果输出到stream指定的文件中,指定出现字符串结束符'\0'为止 参数: stream: 已经打开的文件 format: 字符串格式,用法和printf()一样 返回值: 成功: 实际写入文件的字符个数 失败: -1 ~~~ ~~~ fprintf(fp, "%d %d %d\n", 1, 2, 3); ~~~ ### 读文件fscanf ~~~ #include<stdio.h> int fscanf(FILE * stream, const char * format, ...) 功能: 从stream指定的文件读取字符串,并根据参数format字符串来转换并格式化数据 参数: stream: 已经打开的文件 format: 字符串格式,用法和scanf()一样 返回值: 成功: 参数数目,成功转换的值的个数 失败: -1 ~~~ ~~~ int a = 0; int b = 0; int c = 0; fscanf(fp, "%d %d %d\n", &a, &b, &c); printf("a=%d, b=%d, c=%d\n", a, b, c); ~~~ ## 按照块读写文件 fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite() 对于 Windows 系统,使用 fread() 和 fwrite() 时应该以二进制的形式打开文件 ### 写文件fwrite ~~~ #include<stdio.h> size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE * stream); 功能: 以数据块的方式给文件写入内容 参数: ptr: 准备写入文件数据的地址 size: size_t为unsigned int类型,此参数指定写入文件内容的块数据大小 nmemb: 写入文件的块数,写入文件数据总大小为: `size * nmemb` stream: 已经打开的文件指针 返回值: 成功: 实际成功写入文件数据的块数目,此值和nmemb相等 失败: 0 ~~~ 对参数的说明: * ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。 * size:表示每个数据块的字节数。 * nmemb:表示要读写的数据块的块数。 * stream:表示文件指针。 * 理论上,每次读写 size\*nmemb 个字节的数据 size\_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量 返回值:返回成功读写的块数,也即 nmemb。如果返回值小于 nmemb: * 对于 fwrite() 来说,肯定发生了写入错误,用 ferror() 函数检测。 * 对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测 ### 读文件fread ~~~ #include<stdio.h> size_t fread(void * ptr, size_t size, size_t nmemb, FILE * stream); 功能: 以数据块的方式从文件中读取内容 参数: ptr: 存放读取出来数据的内存空间 size: size_t为unsigned int类型,此参数指定读取文件内容的块数据大小 nmemb: 读取文件的块数,读取文件数据总大小: size*nmemb stream: 已经打开的文件指针 返回值: 成功: 实际成功读取到内容的块数,如果此值比nmemb小,但大于0,说明读到文件的结尾. 失败: 0 ~~~