ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深挖C语言:文件操作

深挖C语言:文件操作 目录前言1.二进制文件和文本文件2.文件的打开和关闭2.1 流和标准流2.1.1 文件流2.1.2 流指针常见误区2.2 文件指针2.3 文件的打开和关闭3.文件的顺序读写3.1 fputc函数、fgetc函数3.2 feof 和 ferror3.3 fputs函数、fgets函数3.4 fprintf函数、fscanf函数3.5 对比 ( /f/s)scanf 与 ( /f/s)printf 函数4.文件的随机读写4.1 fseek函数4.2 ftell函数4.3 rewind函数5. 文件缓冲区5.1 fflush函数6.更新文件前言1. 为什么使用文件如果没有文件我们写的程序的数据是存储在电脑的内存中的如果程序退出内存被回收数据就丢失了等再次运行程序是看不到上次程序的数据的如果要将数据进行持久保存就可以使用文件。2. 什么是文件在程序设计中我们谈的文件一般只有两种程序文件、数据文件从文件功能角度来分类。2.1 程序文件程序文件包括源程序文件后缀为.c目标文件Windows环境后缀为 .obj可执行程序Windows环境后缀为 .exe。2.2 数据文件文件的内容不一定是程序而是程序运行时读写的数据比如程序运行需要从中读取数据的文件或者输出内容的文件。本章讨论的是数据文件。2.3 文件名文件名包含 3 部分文件路径 文件名主干 文件后缀例如c:\code\test.exe文件的绝对路径从根目录如 Linux 的/Windows 的C:\开始完整描述文件位置的路径。例如/home/user/data.txt 或 c:\user\data.txt文件的相对路径相对于程序当前工作目录的路径。它不包含根目录而是从当前所在目录出发。例如data.txt当前目录下、./data.txt当前目录下、../data/file.txt上一级目录的 data 文件夹下。其中.代表当前目录..代表上级目录。1.二进制文件和文本文件二进制文件数据在内存中以二进制的形式存储不加转换的输出到外存的文件中。文本文件以ASCII字符的形式存储的文件在外存上以ASCII码值的形式存储在存储前要换。字符一律以ASCII形式存储数值类型数据既可以用ASCII码的形式存储也可以用二进制形式存储。如果有整数10000如果以ASCII码的形式输出到磁盘则磁盘中占用5个字节每个字符一个字节而二进制形式输出则在磁盘上只占4个字节。代码演示#includestdio.h int main() { int a 10000; FILE* pf fopen(test.txt,wb); //二进制的形式写到文件中 fwrite(a,4,1,pf); fclose(pf); pf NULL; return 0; }在vs上打开二进制文件文件内容2.文件的打开和关闭2.1 流和标准流流流Stream是一种“抽象的数据管道”它表示“数据从一个地方有序地移动到另一个地方的过程/通道”。它不是一种“状态”也不是数据的“形式”而是 C 语言为统一操作各种输入输出设备键盘、屏幕、文件、网络等而设计的一层接口。通过这一层接口程序员不用关心数据到底来自磁盘还是键盘只需像“读水流一样”逐个读取字节或像“写水流一样”逐个写入字节。用生活比喻理解把流想象成水管一边是程序一边是文件/屏幕/键盘。程序往水管里“丢”字节写或从水管里“接”字节读。数据本身可以是任何内容文本、二进制但通过水管时都是字节序列。标准流c语言程序启动时系统会自动为你打开3个预定的流预先为你接好的三根水管它们不需要你手动 fopen 或 fclose。(程序结束时会自动关闭流名称全称默认指向常用函数stdin标准输入键盘scanf()getchar()stdout标准输出屏幕printf()putchar()stderr标准错误屏幕fprintf(stderr,...)、perror注stdout 和 stderr 虽然都默认输出到屏幕但本质是两个不同的流。C语言中就是通过 FILE* 的文件指针来维护流的各种操作的。2.1.1 文件流什么是文件流FILE *fp fopen(data.txt, r);这行代码做了两件事1. 打开磁盘上的文件data.txt2. 在程序和文件之间建立了一条“流”并把这条流的信息保存在 fp 指向的结构体中。这条流可以叫“文件流”因为它的数据来源/去向是磁盘文件。2.1.2 流指针什么是流指针FILE* fp 中的 fp 就是流指针它是一个指向 FILE 结构体的指针。为什么需要流指针1. 因为 FILE 结构体很大且由库内部管理你不能直接复制或定义FILE类型的变量来使用。2. 你只能通过 FILE* 指针间接操作这个结构体。所以流指针 指向某个流的“遥控器”有了它你才能调用 fgetc(fp)、fprintf(fp,...)等函数操作那条流。常见误区❌ 误区1把fp当成文件本身✅ 正确fp不是文件内容也不是文件名它只是指向流的指针流的内部关联了文件。❌ 误区2认为所有流都是文件流✅ 正确stdin、stdout、stderr也是流但它们不一定对应磁盘文件而是对应键盘/屏幕也可通过重定向连接到文件。❌ 误区3以为FILE是文件指针File Pointer✅ 在 C 中“文件指针”通常指FILE *也就是流指针不是指向文件内容的指针。不要混淆“文件位置指针”记录读写位置和“文件流指针”。2.2 文件指针缓冲文件系统中关键的概念是“文件类型指针”简称“文件指针”。每个被使用的文件都在内存中开辟了一个相应的文件信息区用来存放文件的相关信息如文件的名字文件的状态以及文件当前的位置。这些信息是保存在一个结构体变量中的该结构体类型是由系统声明的取名为FILE。例如vs2013编译环境提供的stdio.h文件中有以下的文件类型声明struct _iobuf { char* _ptr; int _cnt; char* _base; int _flag; int _file; int _charbuf; int _bufsiz; char* _tmpfname; }; typedef struct _iobuf FILE;不同的C编译器的FILE类型包含的内容不完全相同但是大同小异。每当打开一个文件的时候系统会根据文件的情况自动创建一个FILE结构的变量并填充其中的信息使用者不必关心细节。一般都是通过一个FILE的指针来维护这个FILE结构的变量这样使用起来更方便。创建一个FILE*的指针变量FILE* pf;//文件指针变量定义pf是一个指向FILE类型数据的指针变量可以使pf指向某个文件的文件信息区(是一个结构体变量。通过该文件信息区中的信息就能够访问该文件。也就是说通过文件指针变量能够间接找到与它相关联的文件。例如2.3 文件的打开和关闭文件在读写之前应该先打开文件在使用结束之后应该关闭文件。在编写程序的时候在打开文件的同时都会返回一个FILE*的指针变量指向该文件也相当于建立了指针和文件的关系。用fopen函数来打开文件fclose来关闭文件。FILE* fopen(const char* filename , const char* mode); fopen的使用 FILE* fp fopen(文件名,模式);功能fopen函数是用来打开参数filename指定的文件同时将打开的文件和一个流进行关联后续对流的操作是通过fopen函数返回的指针来进行。具体对流关联的文件的操作由参数mode来指定。参数filename表示被打开文件的名字这个名字可以是绝对路径也可以是相对路径。mode表示对打开的文件的操作方式。返回值若文件打开成功该函数将返回一个指向FILE对象的指针该指针可用于后续操作中标识对应的流。若文件打开失败则返回NULL指针所以一定要对fopen的返回值做判断来验证文件是否打开成功。fclose函数int fclose(FILE* stream);功能关闭参数stream关联的文件并取消其关联关系。与该流关联的所有内部缓冲区均会解除关联并刷新任何未写入的输出缓冲区内容将被写入任何未读取的输入缓冲区内容将被丢弃。参数stream指向要关闭的流的FILE对象的指针。返回值成功关闭stream 指向的流会返回0否则返回EOF。mode表示对打开文件的操作方式文件使用方式含义如果指定文件不存在r只读为了输入数据打开一个已经存在的文本报错w只写为了输出数据打开一个文本创建一个新的文件a追加向文本文件尾部添加数据创建一个新的文件rb只读为了输入数据打开一个二进制文件报错wb(只写)为了输出数据打开一个二进制文件创建一个新的文件ab追加向一个二进制文件尾添加数据创建一个新的文件r读写为了读和写打开一个文本文件报错w(读写)为了读和写打开一个文本文件创建一个新的文件a(读写)打开一个文件在文件尾进行读写创建一个新的文件rb读写为了读和写打开一个二进制文件报错wb(读写为了读和写新建一个新的二进制文件创建一个新的文件ab(读写)打开一个二进制文件在文件尾进行读和写创建一个新的文件代码演示#includestdio.h int main() { FILE* fp fopen(text.txt,r); //判断 if(fp NULL) { perror(fopen\n); return 1; } printf(打开文件成功\n); //不再使用文件时需要关闭文件 fclose(fp); fp NULL;//指针置为空规避野指针 return 0; }3.文件的顺序读写文件读写时所涉及的函数函数名功能适用于fgetc从输入流中读取一个字符所有输入流fputc向输出流中写入一个字符所有输出流fgets从输入流中读取一个字符串所有输入流fputs向输出流中写入一个字符串所有输出流fscanf从输入流中读取带有格式的数据所有输入流fprintf向输出流中写入带有格式的数据所有输出流fread从输入流中读取一块数据文件输入流fwrite向输出流中写入一块数据文件输出流上述说的适用于所有输入流一般指适用于标准输入流和其他输入流如文件输入流所有输出流一般指适用于标准输出流和其他输出流如文件输出流。3.1 fputc函数、fgetc函数int fputc(int charcater , FILE* stream);功能将参数 character 指定的字符写到 stream 指向的输出流中通常用于向文件或标准输出流写入字符。在写入字符后调整指示器。字符会被写入流内部指示器的位置随后该指示器自动向前移动一个位置。参数character被写入的字符。stream是一个 FILE* 类型的指针指向了输入流通常是文件流或stdout。返回值成功返回写入的字符以int形式。失败返回EOF通常时-1错误指示器会被设置可通过ferror()检查具体错误。代码演示#includestdio.h int main() { FILE* pf fopen(text.txt,w); if(fp NULL) { perror (fopen\n); return 0; } fputc(a,fp); fputc(b,fp); fputc(c,fp); //不再使用文件时需要关闭文件 fclose(fp); fp NULL; //将文件置为空指针避免成为野指针。 return 0; }或者写入的字符直接输出#includestdio.h int main() { fputc(a,stdout); return 0; }fgetc 函数int fgetc( FILE* stream );功能从参数stream指向的流中读取一个字符。函数返回的是文件指示器当前指向的字符读取这个字符之后文件指示器自动前进到下一个字符。参数streamFILE*类型的文件指针可以是 stdin 也可以是其他输入流的指针。如果是 stdin 就从标准输入流读取数据。如果是流指针就从文件读取数据。返回值成功返回读取到的字符的ASCII码值unsigned char 转为 int。其他若调用时流已处于文件末尾函数返回EOF并设置流的文件结束指示器feof。若发生读取错误函数返回EOF并设置流的错误指示器ferror。#include stdio.h int main() { FILE* fp fopen(test.txt, r); if(fp NULL) { perror(fopen\n); return 1; } int i 0; for(i 0; i 10; i) { int c fgetc(fp); fputc(c, stdout); //使⽤fputc在标准输出流上打印字符 } //不再使⽤⽂件时需要关闭⽂件 fclose(fp); fp NULL; //将指针置为NULL,避免成为野指针。 return 0; }3.2 feof 和 ferrorint feof( FILE* stream ); // 检测 stream 指针指向的流是否遇到文件末尾 int ferror( FILE* stream ); // 检测 stream 指针指向的流是否发生了读/写错误如果文件在读取过程中遇见了文件的结尾文件就会读取结束。这时读取函数会在对应的流上设置一个文件结束的指示符这个文件结束指示符可以通过 feof 函数检测到。如果 feof 函数检测到文件结束指示符已经被设置则返回非0值如果没有设置则返回0 。如果文件在读/写文件的过程中发生了读/写错误文件读取就会结束。这时读/写函数会在对应的流上设置一个错误指示符这个错误指示符可以通过 ferror 函数检测到。如果 ferror 函数检查到错误指示符则返回非0值没有则返回0值。代码1//测试feof函数 #includestdio.h int main() { FILE* fp fopen(test.txt,r); if(fp NULL) { perror(fopen); return 1; } for(int i 0; i 10 ;i) { int c fgetc(fp); if(c EOF) { if(feof(fp)) { printf(遇到文件末尾了\n); }else if(ferror(fp)) { printf(读取文件发生了错误\n); }else{ fputc(c,stdout); //使用fputc在标准输出流上打印字符 } } fclose(fp); fp NULL; return 0; }代码2//测试ferror函数 #includestdio.h int main() { FILE* fp fopen(test.txt,w); if(fp NULL) { perror(fopen); return 1; } int c fgetc(fp);//读文件 if(c EOF) { if(feof(fp)) { printf(遇到文件末尾了\n); }else if(ferror(fp)) { printf(读取文件发生了错误\n); }else{ fputc(c,stdout); //使用fputc在标准输出流上打印字符 } fclose(fp); fp NULL; return 0; }3.3 fputs函数、fgets函数int fputs( const char* str , FILE* stream );功能将参数 str 指向的字符串写入到参数 stream 指定的流中不包含结尾的\0适用于文件标准流或标准输出stdout。参数strstr是指针指向了要写入的字符串必须以\0结尾stream是一个 FILE* 的指针指向了要写入字符串的流。返回值成功返回正整数。失败返回EOF(-1)同时会设置流的错误指示器可以使用 ferror() 检查错误原因。#includestdio.h int main() { FILE* pf fopen(text.txt,w); if(pf NULL) { perror(fopen); return 1; } fputs(abc\0def,fp); fputs(hehe,fp); //关闭文件 fclose(pf); pf NULL; return 0; }char* fgets( char* str , int num , FILE* stream);功能从 stream 指定输入流中读取字符串直至读到文件末尾(EOF)或达到指定字符数(包含结尾的空字符 \0 )然后将读取到的字符串存储到 str 指向的空间中。参数str是指向字符数组的指针str 指向的空间用于存储读取到的字符串。num最大读取字符数包含结尾的\0实际最多读取 num - 1 个字符。stream输入流的文件指针如文件流stdin。返回值成功返回 str 指针。其他1. 若在尝试读取字符时遇见文件末尾则设置文件结束指示器并返回NULL需通过feof()检测。2. 若发生读取错误则设置流错误指示器并返回NULL通过ferror()检测。代码演示#includestdio.h int main() { FILE* pf fopen(text.txt,w); if(fp NULL) { perror(fopen); return 1; } char arr[] ----------; fgets(arr,sizeof(arr),fp); fclose(pf); fp NULL; return 0;注1. 若读取到换行符(\n)会将其包含在字符串中除非超出 num - 1 限制然后以 \0 结尾。2. 文件末尾无换行符时字符串以 \0 结尾不包含 \n。3.4 fprintf函数、fscanf函数int fprintf( FILE* stream , const char* format , ...);功能将格式化数据写入stream指定文件流的函数。它与printf类似但是可以输出的任意输出流如磁盘文件标准输出标准错误等而不仅限于控制台。参数stream指向FILE对象的指针表示要写入的文件流如stdout、文件指针等format格式化字符串包含要写入的文本和格式说明符如%d%s等...可变参数列表提供与格式字符串中说明符对应的数据。返回值成功返回写入的字符总数非负值。失败先设置对应流的错误指示器再返回负值可以通过ferror()来检测。#includestdio.h struct Stu { char name[20]; int age; float score; } int main() { struct Stu b {zhangsan,20,85.5f}; FILE* fp fopen(text.txt,w); if(fp NULL) { perror(fopen); return 1; } fprintf(fp , %s %d %.1f,b.name,b.age,b.score); fcolse(fp); fp NULL; return 0; }int fscanf( FILE* stream , const char* format , ...);功能从指定文件流中读取格式化数据的函数与scanf类似但可以指定输入源如文件、标准输入等而非仅限于控制台输入适用于从文件解析结构化数据如整数、浮点数、字符串等参数stream指向FILE对象的指针表示要写入的文件流如stdin、文件指针等。format格式化字符串定义如何解析输入数据如%d、%f、%s等...可变参数列表提供存储数据的变量地址需与格式字符串中的说明符匹配。返回值成功函数返回成功填充到参数列表中的项数。该值可能与预期项数一致也可能因以下原因少于预期值1. 格式和数据匹配失败。2. 读取发生错误。3. 到达文件末尾EOF如果在成功读取到任何数据之前1. 发生读取错误会在对应流上设置错误指示符则返回EOF。2. 到达文件末尾会在对应流上设置文件结束指示符则返回EOF。代码演示#includestdio.h struct Stu { char name[30]; int age; float score; }; int main() { struct Stu s { 0 }; FILE* fp fopen(text.txt,r); if(fp NULL) { perror(fopen); return 1; } fscanf(fp , %s %d %f,s.name,(s.age),(s.score)); fpintf(stdout , %s %d %.1f\n,s.name,s.age,s.score); fclose(fp); fp NULL; return 0; }3.5 对比 ( /f/s)scanf 与 ( /f/s)printf 函数ssprintfint sprintf( char* str , const char* format , ...);功能将格式化数据写入字符数组字符串。它类似于 printf但输出目标不是控制台或文件而是用户指定的内存缓冲区。常用于动态生成字符串、拼接数据或转换数据格式。简而言之就是将格式化的数据转换成一个字符串。参数str指向字符数组的指针用于存储生成的字符串需确保足够大以防溢出。format格式化字符串定义输出格式如%d%f%s等... 可变参数列表提供与格式字符串中说明字符对应的数据。返回值成功返回实际写入的字符数不包含结尾的 \0 。失败返回负数。#includestdio.h struct Stu { char name[30]; int age; float score; } int main() { struct Stu s {zhangsan , 100 , 85.5f}; char arr[100] { 0 }; sprintf(arr , %s %d %.1f , s.name , s.age , s.score); printf(%s\n,arr); return 0; }sscanf函数int sscanf( const char* str , const char* format, ...);功能从字符串中读取格式化数据。与scanf类似但输入源是内存中的字符串而非控制台或文件。常用于解析字符串中的结构化数据如提取数字、分割文本等。参数str要解析的源字符串输入数据来源。format格式化字符串对应任何解析数据如%d、%f、%s等... 可变参数列表提供存储数据的变量地址需与格式字符串中的说明符匹配。返回值成功返回成功解析并赋值的参数数量非负数失败或未匹配到任何数据返回EOF(-1)代码演示#includestdio.h struct Stu { char name[30]; int age; float score; }; int main() { char str[] zhangsan 100 95.50; struct Stu s { 0 }; //从str中的字符串内解析出格式化数据存放在结构体中 sscanf(str,%s %d %f, s.name , (s.age) , (s.score)); //打印结构体s中的数据 printf(%s %d %.1f\n, s.name , s.age , s.score); return 0; }scanf针对标准输入(stdin)的格式化输入函数printf针对标准输入(stdout)的格式化输出函数fscanf针对所有输入流(可以是文件流也可以是stdin)的格式化输入函数fprintf针对所有输出流(可以是文件流也可以是stdout)的格式化输入函数sprintf将格式化的数据转换成字符串sscanf从字符串中提取格式化的数据4.文件的随机读写4.1 fseek函数int fseek( FILE* stream , long int offset , int origin );功能根据文件指针的位置和偏移量来定位文件指针文件内容的光标。参数stream指向FILE类型结构体的指针指定了要定位文件指针的文件流。offset偏移量单位字节可以是正数项文件末尾移动、负数向文件开头移动、0不移动。origin偏移的起始地点参数有三个值SEEK_SET文件开始的位置。SEEK_CUR文件指针当前的位置。SEEK_END文件末尾的位置。返回值成功如果文件位置指针被成功移动fseek返回 0 。失败发生错误例如试图移动到一个不存在的负偏移量位置则返回非零值通常为-1使用注意事项二进制文件 vs 文本文件对于二进制文件fseek的行为非常直观可以精确地移动到任何字节位置。对于文本文件fseek的行为在某些环境下可能不确定因为换行符的转换等问题。唯一被严格保证的用法是将offset设置为 0origin设置为SEEK_SET即移动到文件开头。将offset设置为ftell()的返回值ftell返回当前指针位置。代码演示#include stdio.h int main() { FILE * pFile; pFile fopen ( example.txt , wb ); fputs ( This is an apple. , pFile ); fseek ( pFile , 9 , SEEK_SET ); fputs ( sam , pFile ); fclose ( pFile ); return 0; }4.2 ftell函数long int ftell( FILE* stream );功能返回文件指针相对于起始位置的偏移量。参数stream指向一个已经打开的文件指针。返回值成功返回当前文件位置指针相对于文件开头的偏移量字节数类型为 long int 。失败如果发生错误例如文件流无效或文件不支持定位则返回 -1 。使用注意事项二进制文件 vs 文本文件对于二进制文件ftell的返回值就是相对于文件开头的精确字节数非常可靠。对于文本文件由于不同系统对换行符的处理不同如Windows是\r\nLinux是\nftell的返回值可能不直接等于从文件开头计数的字符数。但在大多数实现中它仍然可以安全地与fseek配合使用来记录和恢复位置。#include stdio.h int main() { FILE * pFile; long size; pFile fopen (myfile.txt,rb); if (pFile NULL) perror (Error opening file); else { fseek (pFile, 0, SEEK_END); // non-portable size ftell (pFile); fclose (pFile); printf (Size of myfile.txt: %ld bytes.\n,size); } return 0; }4.3 rewind函数void rewind( FILE* stream );功能让文件指针的位置回到文件的起始位置并清除文件的错误标志和EOF标志。参数stream指向一个已经打开文件的文件指针。无返回值。使用注意事项清除错误标志1. rewind不仅移动文件指针还会清除文件的错误标志和文件结束标志。2. 这意味着即使在读取文件时遇到了错误或到达了文件末尾调用rewind后文件状态会被重置可以重新开始操作。与fseek的区别1. fseek( fp, 0, SEEK_SET )只移动文件指针不清除错误标志。2. rewind(fp)移动文件指针并清除错误标志。代码演示#include stdio.h int main () { int n; FILE * pFile; char buffer [27]; pFile fopen (myfile.txt,w); for ( nA ; nZ ; n) fputc ( n, pFile); rewind (pFile); fread (buffer,1,26,pFile); fclose (pFile); buffer[26]\0; printf(buffer); return 0; }5. 文件缓冲区含义缓冲区是一块内存用于临时存储数据在程序与文件/设备之间起 “中转站” 作用。为什么需要缓冲区1.磁盘读写速度远慢于 CPU/内存。如果每读/写一个字节都直接访问磁盘效率极低。2.缓冲区一次性批量读写大量数据减少实际 I/O 次数大幅提升性能。5.1 fflush函数int fflush ( FILE* stream );功能强制刷新参数 stream 指定流的缓冲区确保数据写入底层设备。对于输出流将缓冲区中未写入的数据立即写入文件。对于输入流行为由具体情况决定非C语言标准行为可能清空缓冲区参数为NULL时刷新所有打开的输出流。参数stream指向文件流的指针如stdout、文件指针等返回值成功返回0失败返回EOF注意事项1.仅对输出流或更新流最后一次操作为输出有明确刷新行为。2.输⼊流的刷新行为不可移植如清空输入缓冲区是非标准特性。3.程序正常终止exit或调用fclose时会自动刷新但程序崩溃时缓冲区数据可能丢失。代码演示#include stdio.h #include windows.h //VS2022 WIN11环境测试 int main() { FILE*pf fopen(test.txt, w); fputs(abcdef, pf);//先将代码放在输出缓冲区 printf(睡眠10秒-已经写数据了打开test.txt⽂件发现⽂件没有内容\n); Sleep(10000); printf(刷新缓冲区\n); fflush(pf);//刷新缓冲区时才将输出缓冲区的数据写到⽂件磁盘 //注fflush 在⾼版本的VS上不能使⽤了 printf(再睡眠10秒-此时再次打开test.txt⽂件⽂件有内容了\n); Sleep(10000); fclose(pf); //注fclose在关闭⽂件的时候也会刷新缓冲区 pf NULL; return 0; }结论因为有缓冲区的存在C语言在操作文件的时候需要刷新缓冲区或者在文件操作结束的时候关闭文件。否则可能导致读写文件的问题。6.更新文件文件打开方式 rwa 对比图打开方式rwa解释可读/可写可读/可写可读/可写文件不存在时打开失败自动创建新文件自动创建新文件文件存在时保留内容清空内容保留内容初始文件指针位置文件开头文件开头文件末尾写入是否覆盖原有数据是可定位覆盖是内容已清空从头写入否默认是在文件末尾写数据典型用途修改文件部分内容创建新的文件或完全重写旧文件在文件末尾追加数据比如记录日志关键要点1.在写完文件后要继续读文件的时候在读取之前⼀定要使用fflush()刷新文件缓冲区再使用fseek()rewind()重新定位文件指示器的位置。2.在读完文件后需要继续写文件之前在写文件之前使用fseek()rewind()重新定位文件指示器的位置。代码演示#include stdio.h int main() { FILE* fp fopen(test.txt, w); if (fp NULL) { perror(fopen for w); return 1; } //写abcdefghi到⽂件中 fputs(abcdefghi, fp); //刷新缓冲区保证数据写⼊⽂件 fflush(fp); //要读取数据b字符先定位⽂件指针 fseek(fp, 1, SEEK_SET); int ch fgetc(fp);//读取字符 printf(%c\n, ch); //在b的位置开始写⼊hello fseek(fp, -1, SEEK_CUR); //解释因为前⾯读取⼀个字符后,⽂件指⽰器现在指向了c,需要从当前位置退回⼀个字符 fputs(hello, fp); //关闭⽂件 fclose(fp); fp NULL; return 0; }最后感谢阅读欢迎大家交流与指正。
返回列表