廊坊做网站上海公司电话,e龙岩官网下载,软文标题例子,今天东莞封路C语言之文件操作#xff08;下#xff09; 文章目录 C语言之文件操作#xff08;下#xff09;1. 文件的顺序读写1.1 文件的顺序读写函数1.1.1 字符输入/输出函数#xff08;fgetc/fputc#xff09;1.1.2 ⽂本⾏输⼊/输出函数#xff08;fgets/fputs#xff09;1.1.3 格…C语言之文件操作下 文章目录 C语言之文件操作下1. 文件的顺序读写1.1 文件的顺序读写函数1.1.1 字符输入/输出函数fgetc/fputc1.1.2 ⽂本⾏输⼊/输出函数fgets/fputs1.1.3 格式化输入/输出函数fscanf/fprintf1.1.4 二进制输入/输出fread/fwrite 2. 文件的随机读写2.1 fseek2.2 ftell2.3 rewind 3. 文件读取结束的判定3.1 feof/ferror4.文件缓冲区 在上篇博文中介绍到了文件的打开fopen和关闭fclose以及文件指针FILE*,在这边博文中将介绍文件的读写
1. 文件的顺序读写
1.1 文件的顺序读写函数
函数名功能适用于fgetc字符输入函数所有输入流fputc字符输出函数所以输出流fgets⽂本⾏输⼊函数所以输入流fputs⽂本⾏输出函数所以输出流fscanf格式化输入函数所以输入流fprintf格式化输出函数所以输出流fread二进制输入文件fwrite二进制输出文件
所有输入流/所有输出流:适⽤于标准输⼊/输出流和其他输⼊/输出流如⽂件输⼊/输出流
1.1.1 字符输入/输出函数fgetc/fputc
字符输入/输出函数:用于单个字符的输入/输出
fgetc():从文件中读取字符
int fgetc ( FILE * stream );fputc():将字符写入文件
int fputc ( int character, FILE * stream );示例如下
#include stdio.h
#include string.hint main()
{FILE* pfwrite fopen(test.txt, w); //以只写的方式打开文件if (pfwrite NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}fputc(a, pfwrite); //将‘a’放入文件fclose(pfwrite); //关闭文件pfwrite NULL; //文件指针置NULLFILE* pfread fopen(test.txt, r); //以只读的方式打开文件if (pfread NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}int ch fgetc(pfread); //将读取的字符存放到 chprintf(%c, ch); //打印chfclose(pfread); //关闭文件pfread NULL; //文件指针置NULLreturn 0;
}注每次打开同一个文件时无论是否有内容写入文件的内容会被覆盖 1.1.2 ⽂本⾏输⼊/输出函数fgets/fputs
⽂本⾏输⼊/输出函数:用于字符串的输入/输出
fgets():从文件中读取 num 个长度的字符
char * fgets ( char * str, int num, FILE * stream );fputs():将字符串写入文件
int fputs ( const char * str, FILE * stream );示例如下
#include stdio.h
#include string.hint main()
{FILE* pfwrite fopen(test.txt, w); //以只写的方式打开文件if (pfwrite NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}fputs(abcdef\n, pfwrite); //将abcdef\n放入文件fclose(pfwrite); //关闭文件pfwrite NULL; //文件指针置NULLFILE* pfread fopen(test.txt, r); //以只读的方式打开文件if (pfread NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}char str[20] { 0 };fgets(str,5,pfread); //将读取的字符存放到 strprintf(%s\n, str); //打印strfclose(pfread); //关闭文件pfread NULL; //文件指针置NULLreturn 0;
}注当我们写入一串字符串时如果不主动换行会在同一行写入所有如果我们要换行的话我们可以在输入的字符串中加上个\n 1.1.3 格式化输入/输出函数fscanf/fprintf
格式化输入/输出函数:用于按格式将数据输出/输入文件
fscanf():将数据按格式读取文件
int fscanf ( FILE * stream, const char * format, ... );
int scanf ( const char * format, ... );fprintf():将数据按格式的写入文件
int fprintf ( FILE * stream, const char * format, ... );
int printf( const char * str, ...);fscanf()/fprintf()和正常的scanf()/printf()用法一样不过是从文件中读取/写入 示例如下
#include stdio.h
#include string.hstruct Stu
{char name[20];int age;float score;
};
int main()
{struct Stu s1 { zhangsan,18,92.3f };struct Stu s2 { 0 };FILE* pfwrite fopen(test.txt, w); //以只写的方式打开文件if (pfwrite NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}fprintf(pfwrite,%s %d %f,s1.name,s1.age,s1.score); //将s1中的内容放入文件fclose(pfwrite); //关闭文件pfwrite NULL; //文件指针置NULLFILE* pfread fopen(test.txt, r); //以只读的方式打开文件if (pfread NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}fscanf(pfread, %s %d %f, s2.name, (s2.age), (s2.score)); //将读取的字符存放到 s2fprintf(stdout, %s %d %.2f, s2.name, s2.age, s2.score); //使用fprintf将s2中的内容打印到屏幕fclose(pfread); //关闭文件pfread NULL; //文件指针置NULLreturn 0;
}注:stdout为标准输出流屏幕stdin为标准输入流键盘stderr为标准错误流屏幕 1.1.4 二进制输入/输出fread/fwrite
二进制输入/输出:将二进制输入/输出到文件只针对文件
fread():从文件中读取count个大小为size的数据存放在ptr指向的数据
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );fwrite():将ptr指向的数据写入count个大小为size到文件
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );示例如下
#include stdio.h
#include string.hint main()
{int a 10000;int b 0;FILE* pfwrite fopen(test.txt, wb); //以只写的方式打开文件if (pfwrite NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}fwrite(a,sizeof(int),1,pfwrite); //将a中的数据以二进制形式写入文件fclose(pfwrite); //关闭文件pfwrite NULL; //文件指针置NULLFILE* pfread fopen(test.txt, rb); //以只读的方式打开文件if (pfread NULL) //判断是否打开成功{perror(fopen); //如果打开失败根据错误码打印错误信息return 1; //关闭程序}fread(b,sizeof(int),1,pfread); //将读取的数据放到 bprintf(%d, b);fclose(pfread); //关闭文件pfread NULL; //文件指针置NULLreturn 0;
}注写入记事本中的二进制数据是不能直接看出来的但是无论放入还是取出来都是10000所以不用过度关注 2. 文件的随机读写
在文件中写入一个数据文件指针就向后走那我们要如何在指定位置写入或读取数据呢 下面来介绍三个函数fseek ftell rewind
2.1 fseek
fseek:为根据文件指针的位置向前或向后移动文字指针
int fseek ( FILE * stream, long int offset, int origin );offset:为偏移量向前或向后或不动 origin :为文件的位置 关于origin C语言中规定有三个取值 SEEK_SET 文件的起始位置SEEK_CUR 文件指针的当前位置SEEK_END 文件的末尾 示例如下
#include stdio.h
#include string.hint main()
{FILE* pf fopen(test.txt, r);if (!pf){perror(fopen);return -1;}//假设文件中已经有字符了 abcdefint ch fgetc(pf); printf(%c\n, ch); //打印ach fgetc(pf);printf(%c\n, ch); //打印bch fgetc(pf);printf(%c\n, ch); //打印cch fgetc(pf);printf(%c\n, ch); //打印d//三种方式都可以//fseek(pf, -4, SEEK_CUR);//当前位置d,倒退4个字节,a//fseek(pf, 0, SEEK_SET);//当前位置d,文件起始位置fseek(pf, -6, SEEK_END);//当前位置d,文件末尾位置倒退6个字节ach fgetc(pf);printf(%c\n, ch); //打印afclose(pf);pf NULL;return 0;
}2.2 ftell
ftell:为相对文件起始位置的偏移量
long int ftell ( FILE * stream );#include stdio.h
#include string.hint main()
{FILE* pf fopen(test.txt, r);if (!pf){perror(fopen);return -1;}//假设文件中已经有字符了 abcdefint ch fgetc(pf); printf(%c\n, ch); //打印ach fgetc(pf);printf(%c\n, ch); //打印bch fgetc(pf);printf(%c\n, ch); //打印cch fgetc(pf);printf(%c\n, ch); //打印dch fgetc(pf);printf(%c\n, ch); //打印eint ret ftell(pf); //打印了5次相对文件起始位置5个字节printf(%d,ret); fclose(pf);pf NULL;return 0;
}2.3 rewind
frewind:为回到文件的起始位置
void rewind ( FILE * stream );#include stdio.h
#include string.hint main()
{FILE* pf fopen(test.txt, r);if (!pf){perror(fopen);return -1;}//假设文件中已经有字符了 abcdefint ch fgetc(pf); printf(%c\n, ch); //打印ach fgetc(pf);printf(%c\n, ch); //打印bch fgetc(pf);printf(%c\n, ch); //打印cch fgetc(pf);printf(%c\n, ch); //打印drewind(pf);ch fgetc(pf);printf(%c\n, ch); //打印afclose(pf);pf NULL;return 0;
}3. 文件读取结束的判定
3.1 feof/ferror 在文件读取过程中不能使用feof函数的返回值直接判断文件是否结束 feof:为在文件读取结束的时候判断读取结束的原因是否是遇到文件尾结束 ferror:为在文件读取结束的时候判断读取结束的原因是否是遇到错误结束
使用feof判断不同文件读取结束的方法
文本文件判断返回值是否为EOF或者NULL 例如 fgetc判断返回值是否为EOF fgets判断返回值是否为NULL二进制文件判断返回值是否小于实际读取个数 例如 fread判断返回值是否为实际读取的个数
feof/ferror使用示例如下 文本文件
#include stdio.h
#include string.hint main(void)
{int c 0;FILE* fp fopen(testc.txt, r);if (!fp) {perror(fopen);return 1;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候都会返回EOFwhile ((c fgetc(fp)) ! EOF) {putchar(c);}//判断是什么原因结束的if (ferror(fp))perror(error); //文件遇到错误结束则打印错误信息else if (feof(fp))printf(success); //文件正常结束成功则打印successfclose(fp);
}二进制文件
#include stdio.h
int main()
{int a 10;int b 0;FILE* pf fopen(test.txt, rb);if (pf NULL){perror(fopen);return 1;}//fwrite(a, sizeof a, 1, pf);size_t ret fread(b, sizeof b, 5, pf);if (ret 5) //当返回值等于读取的个数表示成功{printf(success);}else{if (ferror(pf)) //判断是否遇到错误{perror(ferror);}else if(feof(pf)) //判断是否文件结束{printf(feof);}}fclose(pf);pf NULL;return 0;
}4.文件缓冲区
ANSIC 标准采⽤“缓冲⽂件系统”处理的数据⽂件的所谓缓冲⽂件系统是指系统⾃动地在内存中为程序中每⼀个正在使⽤的⽂件开辟⼀块“⽂件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读⼊数据则从磁盘⽂件中读取数据输⼊到内存缓冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的⼤⼩根据C编译系统决定的 注当我们写入或读取文件的时候并不是立刻完成的而且将要写入或读取的数据放在文件缓冲区等缓冲区满了或者刷新缓冲区时fflush 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;
}