个人搭建网站要多少钱,罗岗网站建设哪家好,seo优化提升排名,网络系统管理员目录 概念 文件名 文件的打开和关闭
fopen
fclose
输入输出函数 fputc
fgetc
fputs
fgets
fprintf
fscanf
fwrite
fread
三种流
scanf和sprintf 结构体转化
编辑 文件的随机读写
fseek
ftell
rewind
文本文件和二进制文件
文件读取结束的判定
文件缓冲…目录 概念 文件名 文件的打开和关闭
fopen
fclose
输入输出函数 fputc
fgetc
fputs
fgets
fprintf
fscanf
fwrite
fread
三种流
scanf和sprintf 结构体转化
编辑 文件的随机读写
fseek
ftell
rewind
文本文件和二进制文件
文件读取结束的判定
文件缓冲区 概念 文件的作用文件是存放于硬盘中的使数据能够持久化保存。 数据文件文件的内容不一定是程序它可以是程序运行时产生的读写数据。 有时后我们会将文件输出到磁盘上在需要的时候再从磁盘上把数据读取到内存中使用。 文件名 一个文件需要一个唯一的文件标识 文件路径 文件名主干 文件后缀 例: c:\code\test.txt 文件的打开和关闭 为了方便访问文件中的数据每个被使用的文件都在内存中开辟了一个相应的文件信息区记录文件名和文件的状态、文件路径等。这个文件信息区被存放在一个结构体变量中通过文件指针可以访问这块区域并对文件实施各种操作。 FILE* pf;//文件指针变量 fopen 根据文件名打开打开文件并返回一个FILE*类型的指针。 文件操作模式类型(第二个参数) 注意文件路径可以是相对或绝对路径
fclose 关闭文件和fopen一起使用。 输入输出函数 fputc 意为将字符写入到文件中。 返回值: 为字符的ASCII码值(非负值。失败返回-1。 利用返回值将写入的数据依次打印到屏幕上:
int main()
{//打开文件FILE* pf fopen(text.txt, w);if (NULL pf){perror(fopen);return 1;}//写文件int i 0;for (i 0; i 26; i){putchar(fputc(ai, pf));}fclose(pf);pf NULL;return 0;
}
fgetc 意为获取文件中的字符并返回它的ascii码值。在使用fgetc前要确保文件状态为 r 专注输入数据而非w专注输出数据否则会导致读取失败。 pf指针具有Placeholder指针可以遍历文件 int main()
{//打开文件FILE* pf fopen(text.txt, r);if (NULL pf){perror(fopen);return 1;}
int ch 0;while ((ch fgetc(pf)) ! EOF)//意为读取文件所有内容之后返回-1文件末尾{printf(%c, ch);}fclose(pf);pf NULL;return 0;
} fputs 作用将字符串写入到文件中想达到按行写入可以主动加上\n。 返回值成功时返回非负值失败返回-1。 fgets 作用从文件中依次读取字符串遇到\n或者读取num-1个数字后终止读取。也就是说它只读取num-1个数字并在num或\n后处自动补上\0。 返回值str的首地址若失败返回NULL。 fprintf 从文件流中按照一定格式写数据。 例如复杂的结构体
struct S
{char name[20];int age;float score;
}; fscanf 从文件流中按照一定格式读数据。 当然你也可以用前面的文件读取函数进行读取
char arr[20] { 0 };
fgets(arr,20,pf);//也行
printf(%s,arr);
fwrite 对文件进行二进制写入。[适用于所有类型] 第一个参数为写入数据的地址第二个参数为数据的大小第三个参数为数据个数。类似于memcpy一个字节一个字节拷贝数据。 注意读写二进制文件属性要变为 ”wb 这下知道文件中为什么会有乱码了吧~
fread 对文件进行二进制读取会返回读取成功的count个数。 三种流 而文件输入输出函数适用于所有流它们对数据的操作可以不局限于文件。也就是说可以用它们实现像scanf、printf之类函数的功能
fprintf(stdout, hello world);//屏幕
int a 0;
fscanf(stdin,%d ,a);//键盘
scanf和sprintf sscanf是按照一定格式将字符串转换为特定格式。 sprintf是将其他数据类型按照指定的格式转换成字符串。【后面自动补‘\0’】 结构体转化
将结构体转化成字符串 将字符串转化成结构体 文件的随机读写
fseek 作用将流里文件指针设置起始位置和偏移量按此偏移量的位置进行读写操作。 SEEK_END为末尾数据的下一个位置 int ch fgetc(pf);putchar(ch);
//afseek(pf,-2,SEEK_END);//反向找ch fgetc(pf);putchar(ch);
//efseek(pf, 0, SEEK_SET);//回到起始位置ch fgetc(pf);putchar(ch);
//a//查找完a后指针位置会向后增1fseek(pf, 3, SEEK_CUR);//b--cdech fgetc(pf);putchar(ch);
//eftell 返回当前文件指针所指向的位置偏移量。 rewind 将文件指针设置成最开始的位置。 文本文件和二进制文件 数据在内存中以二进制的形式存储如果不加转换的输出到外存就是 二进制文件 。乱码 字符一律以 ASCII 形式存储数值型数据既可以用 ASCII 形式存储也可以使用二进制形式存储。 对于整数10000以ASCII码存储为5个字节而二进制存储只占4和字节。
文件读取结束的判定 牢记在文件读取过程中不能用 feof 函数的返回值直接用来判断文件的是否结束。 而是 应用于当文件读取结束的时候判断是读取失败结束还是遇到文件尾结束。 fgetc 判断是否为 EOF . fgets 判断返回值是否为 NULL . fread判断返回值是否小于实际要读的个数。
fgetc
int main(void)
{int c; // 注意int非char要求处理EOFFILE* fp fopen(test.txt, r);if(!fp) {perror(File opening failed);return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到文件结束的时候都会返回EOFwhile ((c fgetc(fp)) ! EOF) { putchar(c);}if (ferror(fp))puts(I/O error when reading);else if (feof(fp))puts(End of file reached successfully);fclose(fp);
} 二进制
#include stdio.h
enum { SIZE 5 };
int main(void)
{double a[SIZE] {1.,2.,3.,4.,5.};FILE *fp fopen(test.bin, wb); // 必须用二进制模式fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp fopen(test.bin,rb);size_t ret_code fread(b, sizeof *b, SIZE, fp); // 读 double 的数组if(ret_code SIZE) {puts(Array read successfully, contents: );for(int n 0; n SIZE; n) printf(%f , b[n]);putchar(\n);} else {if (feof(fp))printf(Error reading test.bin: unexpected end of file\n);else if (ferror(fp)) {perror(Error reading test.bin);}}fclose(fp);
}
文件缓冲区 所谓文件缓冲区就是在使用文件时系统会为每个文件分配一块缓冲区用于存放数据当内存向磁盘中传输数据或当磁盘向内存中传输数据的时候这些数据会一个一个被加载到缓存区上再一齐被加载到内存或磁盘上。 作用将缓存区中的数据输出到流里stdout、FILE
#include windows.h
#include stdio.h
int main()
{FILE* pf fopen(text.txt, w);if (NULL pf){perror(fopen);return 1;}int a 10000;fwrite(a, sizeof(int), 1, pf);//二进制printf(内容存放在缓冲区此时打开文件无内容\n);Sleep(10000);//休眠10秒数据已经在缓存区上了fflush(pf);//刷新缓冲区printf(再打开文件内容已存在\n);fclose(pf);//注fclose在关闭文件的时候也会刷新缓冲区pf NULL;
}
注读取写入数据时遇到\n或fclose也会刷新缓冲区。
所以在我们对文件进行操作时别忘了执行刷新缓冲区和文件关闭操作!否则可能造成文件读写出错。