txt文件本质是二进制字节流(0、1)。英文和数字兼容ASCII码,汉字存储用UTF-8或GBK。
ASCII码:表中只有128个位置(低7位),用来存储英文、数字、基础符号
UTF-8:通常占3字节,“全球统一标准”,现代Linux、网络传输协议默认标准。目标把世界所有国家文字和符号分配唯一标号。
GBK:汉字通产占2字节,“中国汉字扩展规范”。
打开文件
FILE*fopen(constchar*_Filename,constchar*_Mode)FILE *:返回文本地址,失败返回NULL- 下划线
_是标准库头文件为了防止和用户代码中的局部变量重名而加的前缀。 - _Filename:文件路径
- _Mode打开模式:
“r”(只读)。文件不存在,fopen返回NULL。“w”(覆盖写)- 文件不存在,新建一个
- 文件已存在,清空原内容,重新写。
“a”(appen 追加写)- 文件不存在,新建一个。
- 文件已存在,保留原内容,光标跳到文件末尾往后写。
- 带
“+”的模式"r+":允许读和写(文件必须存在)。"w+":允许读和写(若存在则清空,若不存在则新建)。"a+":允许读取并在末尾追加。
文件的读取
(1)fgetc 函数
intfgetc(FILE*_File);_File:传入fopen打开的文件指针。
fgetc的功能是从指定的文件中读取一个字符(1个字节),并将文件内部的读取位置向后移动一位。
#include<stdio.h>intmain(){FILE*fp;fp=fopen("test.txt","r");chara;a=fgetc(fp);printf("%c",a);//在控制台输出读取的字符}全部读取
fgetc函数每读取一个字符,读取完成后文件指针向后移动一个位置,下一次读取就是第二个字符。通过循环来实现文件内容的全部读取。
intch;// 必须用int,不能写char,while((ch=fgetc(fp))!=EOF){putchar(ch);}EOF是End Of File(文件结束符)缩写,是 C 语言标准库
<stdio.h>中定义的一个宏常量。#defineEOF(-1)
(2)fgets函数
char*fgets(char*_Buf,int_MaxCount,FILE*_File);- _Buf:缓冲区
- _MaxCount:读取字符数量
- _File:文件的地址
#include<stdio.h>intmain(void){FILE*fp=fopen("test.txt","r");charbuffebuffer[10];fgets(buffer,10,fp);//最大读取10个printf("%s",s);return0;}文件写入
(1)fputc函数
只写单个字符
intfputc(int_Ch,FILE*_File);- _Ch:写入字符
- _File:文件的指针
#include<stdio.h>intmain(){FILE*fp;fp=fopen("text.txt","w");fputc('s',fp);//写入一个字符sfclose(fp);}(2)fputs函数
只写固定字符串
intfputs(constchar*_Str,FILE*_File);- 写入字符串首地址
- 写入文件的指针
#include<stdio.h>intmain(void){FILE*fp=fopen("test.txt","a");fputs("Hello!\n",fp);fclose(fp);return0;}(3)fprintf函数
fprintf与printf用法一致,仅增加了目标文件指针参数,用于将格式化数据定向输出至文件。
intfprintf(FILE*_stream,constchar*_format,argument...)- _stream:指定数据输出到哪个文件
- _format:格式字符串
#include<stdio.h>intmain(void){FILE*fp=fopen("record.txt","w");intid=1001;charname[]="Su";fprintf(fp,"ID: %d、Name: %s \n",id,name);fclose(fp);fp=NULL;return0;}(4)vfprintf 函数
用于接收可变参数列表并输出至文件的底层格式化函数。
intvfprintf(FILE*__stream,constchar*_format,__builtin_va_list __local_argv);使用由va_start(或va_copy)初始化的va_list参数指针,按format格式化解析数据并写入目标文件流stream
与
fprintf的区别:fprintf接收由逗号分隔的具体实参列表(...),而vfprintf接收打包好的参数指针变量(va_list)。
缓冲区刷新
intfflush(FILE*_File);将内存缓冲区中暂存的数据立即写入目标文件。
#include<stdio.h>intmain(void){FILE*fp=fopen("run.log","a");fprintf(fp,"Critical event occurred.\n");// 强制刷入磁盘fflush(fp);fclose(fp);fp=NULL;return0;}文件关闭
intfclose(FILE*_File);_File:传入fopen打开的文件指针。
文件的指针定位
(1)rewind 函数
voidrewind(FILE*_File);- 功能:将文本文件的指针返回到文本的开始位置。
文件流缓冲区配置
intsetvbuf(FILE*stream,char*buffer,intmode,size_tsize);- stream:目标文件指针
- buffer:用户自定义的缓冲区内存首地址
- mode:缓冲模式枚举常量
_IOFBF(全缓冲):当缓冲区被填满,或调用fflush/fclose,才会向物理磁盘落盘。_IOLBF(行缓冲):遇到换行符\n时立刻刷新写入。_IONBF(无缓冲):不使用任何缓冲。
- size:缓冲区字节数大小。