3.3 fprintf函数和fscanf函数
3.3.1 fprintf函数
fprintf函数的作用是将格式化数据写入流。
int fprintf ( FILE * stream, const char * format, ... );
参数:stream:指向标识输出流的 FILE 对象的指针。
format:包含要写入流的文本的 C 字符串。它可以选择性地包含嵌入的格式说明符,这 些说明符由后续附加参数中指定的值替换,并根据请求设置格式。
返回值:成功后,将返回写入的字符总数。如果发生写入错误,则设置错误指示器(ferror)并返回负数。
3.3.2 fscanf函数
fscanf函数的作用是从流中读取格式化数据
int fscanf ( FILE * stream, const char * format, ... );
参数:stream:指向标识要从中读取数据的输入流的 FILE 对象的指针。
format:C 字符串,包含一系列字符。
返回值:成功后,该函数返回成功填充的参数列表的项数。此计数可以与预期的项目数匹配,也可以由于匹配失败、读取错误或文件末尾的到达而减少(甚至为零)。如果发生读取错误或在读取时到达文件末尾,则会设置正确的指示器(feof 或 ferror)。并且,如果在成功读取任何数据之前发生任一情况,则返回 EOF。
实例展示:
文件写入:
#include <stdio.h>//使用File结构体类型需要包含头文件stdio.h int main() { FILE* pf = fopen("text.txt","w");//文件以写入的方式打开 typedef struct s { int age; char name[20]; }type; type s = { 10,"张三" }; if (pf != NULL) { fprintf(pf, "%d %s", s.age, s.name); } fclose(pf); pf = NULL; return 0; }
结果展示:
文件读取:
#include <stdio.h>//使用File结构体类型需要包含头文件stdio.h int main() { FILE* pf = fopen("text.txt","r");//文件以读取的方式打开 typedef struct s { int age; char name[20]; }type; type s ; if (pf != NULL) { fscanf(pf, "%d %s", &s.age, s.name); } printf("%d %s", s.age, s.name); fclose(pf); pf = NULL; return 0; }
结果展示:
3.4 fwrite函数和fread函数
3.4.1 fwrite函数
fwrite函数是将数据以二进制的形式写入文件
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
参数:ptr:指向要写入的元素数组的指针,转换为 const void*
size:要写入的每个元素的大小(以字节为单位)。
count:元素数,每个元素的大小为字节大小。
stream:指向指定输出流的 FILE 对象的指针。
返回值:返回成功写入的元素总数。如果此数字与 count 参数不同,则写入错误阻止函数完成。在这种情况下,将为流设置错误指示器(ferror)。如果大小或计数为零,则该函数返回零,错误指示器保持不变。
3.4.2 fread函数
fread函数是从流中读取计数元素数组,每个元素的大小为字节,并将它们存储在 ptr 指定的内存块中。流的位置指示器按读取的总字节数前进。
size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
参数:ptr:指向大小至少为 (size*count) 字节的内存块的指针,转换为 void*。
size:要读取的每个元素的大小(以字节为单位)。
count:元素数,每个元素的大小为字节大小。
stream:指向指定输入流的 FILE 对象的指针。
返回值:返回成功读取的元素总数。如果此数字与 count 参数不同,则表示读取时发生读取错误或到达文件末尾。在这两种情况下,都会设置正确的指标,可以分别用 ferror 和 feof 进行检查。
如果大小或计数为零,则该函数返回零,并且流状态和 ptr 指向的内容保持不变。
实例展示:
文件写入:
#include <stdio.h>//使用File结构体类型需要包含头文件stdio.h int main() { FILE* pf = fopen("text.txt","wb");//文件以二进制的写入的方式打开 char arr[20] = "张三"; if (pf != NULL) { fwrite(arr, 4, sizeof(char), pf); } fclose(pf); pf = NULL; return 0; }
结果展示:
文件读取:
#include <stdio.h>//使用File结构体类型需要包含头文件stdio.h int main() { FILE* pf = fopen("text.txt","rb");//文件以二进制的读取的方式打开 char arr[20] = {0}; if (pf != NULL) { fread(arr, 4, sizeof(char), pf); } printf(" % s", arr); fclose(pf); pf = NULL; return 0; }
结果展示:
4.文件随机读取
决定文件读取顺序的是文件指针的位置,而这里我就给大家介绍三个函数,来对文件指针进行操作,以对文件进行随机读取
4.1 fseek函数
fseek函数的作用是根据文件指针的位置和偏移量来定位文件指针。
int fseek ( FILE * stream , long int offset , int origin );
参数:
stream:指向标识流的 FILE 对象的指针。
offect: 二进制文件:要从源偏移的字节数。
文本文件:零或 ftell 返回的值。
origin:作偏移参考的位置。它由 <cstdio> 中定义的以下常量之一指定,专门用作此函数的参数:
Constant
Reference position
SEEK_SET 文件开头
SEEK_CUR 文件指针的当前位置
SEEK_END 文件结尾 *
返回值:如果成功,该函数将返回零。否则,它将返回非零值。如果发生读取或写入错误,则设置错误指示器(ferror)。
使用展示:
#include <stdio.h> int main() { FILE* pFile; pFile = fopen("text.txt", "wb"); fputs("This is an apple.", pFile); fseek(pFile, 9, SEEK_SET);//表示从文件开头文件指针到偏移量为9的位置 fputs(" sam", pFile); fclose(pFile); return 0; }
结果展示:
4.2 ftell
ftell函数的作用是返回文件指针相对于起始位置的偏移量
long int ftell ( FILE * stream );
参数:stream:指向标识流的 FILE 对象的指针。
返回值:成功后,返回仓位指标的当前值。失败时,返回 -1L,并将 errno 设置为特定于系统的正值。
使用展示:
#include <stdio.h> int main() { FILE* pFile; pFile = fopen("text.txt", "wb"); fputs("This is an apple.", pFile); fseek(pFile, 9, SEEK_SET); printf("%d", ftell(pFile)); fclose(pFile); return 0; }
结果展示:
4.3 rewind函数
rewind函数的作用是让文件指针的位置回到文件的起始位置
void rewind ( FILE * stream );
参数:stream:指向标识流的 FILE 对象的指针。
使用展示:
#include <stdio.h> int main() { FILE* pFile; pFile = fopen("text.txt", "wb"); fputs("This is an apple.", pFile); fseek(pFile, 9, SEEK_SET); printf("%d\n", ftell(pFile)); rewind(pFile); printf("%d\n", ftell(pFile)); fclose(pFile); return 0; }
结果展示:
5.文件读取结束的判定
5.1 feof函数
牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。 而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。
int feof ( FILE * stream );
参数:指向标识流的 FILE 对象的指针。
返回值:如果设置了与流关联的文件结束指示符,则返回非零值。否则,返回零。
除此之外还有一些返回值能判断文件是否读取结束,如
判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )
例如:
fgetc 判断是否为 EOF .
fgets 判断返回值是否为 NULL .
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。
6.文件缓冲区
ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。