简单网站开发实例总结,工信部域名信息备案管理系统查询,开封网站seo,电子商务包括哪些欢迎来CILMY23的博客喔#xff0c;本篇为【C语言】文件操作揭秘#xff1a;C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】#xff0c;感谢观看#xff0c;支持的可以给个一键三连#xff0c;点赞关注收藏。 前言 欢迎来到本篇博客本篇为【C语言】文件操作揭秘C语言中文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析【图文详解】感谢观看支持的可以给个一键三连点赞关注收藏。 前言 欢迎来到本篇博客上一篇我们详细介绍C语言中的文件操作。 在计算机领域文件是一种常见的存储和处理信息的方式。通过文件我们可以将数据和程序永久保存在硬盘中并随时读取和修改。本篇博客将深入探讨文件操作、文件的顺序读写、随机读写、判断文件结束和文件缓冲区详细解析。 上一篇博客链接 【C语言】文件操作篇-----程序文件和数据文件文件的打开和关闭二进制文件和文本文件fopenfclose【图文详解】-CSDN博客 文章目录
一、文件的顺序读写
1.1 文件顺序读写的函数介绍 1.2 fgetc和fputc的使用
1.3 fgets和fputs的使用
1.4 fprintf和printf的使用
1.5 fscanf和scanf的使用
1.6 sscanf和sprintf的介绍和使用
1.7 fwrite和fread的使用
1.8 总结
二、文件的随机读写
2.1 fseek函数 2.2 ftell函数
三、文件读取结束的判定
四、文件缓冲区 一、文件的顺序读写 文件顺序读写是指按照数据在文件中的顺序依次读取或写入数据的操作方式。在文件顺序读写中数据按照其存储在文件中的顺序被逐个读取或写入。
对于顺序读取程序会依次读取文件中的数据从文件的开头一直读取到末尾直到到达文件结束的位置或者读取到所需的数据为止。每次读取数据后读取指针会自动向后移动到下一个数据的位置。
对于顺序写入程序会依次将数据写入文件从文件的结尾开始写入每写入一个数据后写入指针会自动移动到下一个位置以便写入下一个数据。这样数据会按照写入的顺序依次添加到文件中。
1.1 文件顺序读写的函数介绍 上面说的使用于所有输入流⼀般指使用于标准输入流和其他输入流如文件输入流所有输出流⼀般指使用于标准输出流和其他输出流如文件输出流。 fgetc 和 fputc: 这两个函数用于逐个字符地读取和写入文件。一次读取写入一个 它们的原型如下 int fgetc(FILE *stream);
int fputc(int character, FILE *stream); fgets从指定文件中读取一行数据包括换行符并将其存储到指定的字符数组中。 原型如下 char *fgets(char *str, int n, FILE *stream); fputs将指定的字符串写入到指定文件中。一次写一行数据 原型如下 int fputs(const char *str, FILE *stream); fscanf: 该函数用于从文件中按照指定的格式读取数据。 它的原型如下 int fscanf(FILE *stream, const char *format, ...); fprintf: 该函数用于向文件中按照指定的格式写入数据。 它的原型如下 int fprintf(FILE *stream, const char *format, ...); fread函数 函数原型 size_t fread(void *ptr, size_t size, size_t count, FILE *stream); 功能从指定文件中读取二进制数据并将其存储到指定的内存位置。参数 ptr指向存储读取的数据的内存位置的指针。size每个数据项的字节数。count要读取的数据项的个数。stream指向已打开文件的指针表示从该文件中读取数据。返回值返回实际成功读取的数据项数目如果返回值少于count则可能表示已到达文件末尾或发生了错误。 fwrite函数 函数原型 size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream); 功能将二进制数据写入指定文件中。参数 ptr指向要写入的数据的内存位置的指针。size每个数据项的字节数。count要写入的数据项的个数。stream指向已打开文件的指针表示将数据写入到该文件中。返回值返回实际成功写入的数据项数目如果返回值少于count则可能表示发生了错误。 1.2 fgetc和fputc的使用
我们现在在当前路径下C:\Users\云山若汐\source\repos\test2\test2
放入两个文件
write可以不放然后我们在text中输入abcd我们现在将要拷贝当中的字符到write中所以写下以下代码
#includestdio.hint main()
{char ch;FILE* pfread fopen(text.txt, r);if (pfread NULL){perror(fopen - 1);return 1;}FILE* pfwrite fopen(write.txt, w);if (pfwrite NULL){perror(fopen - 2);return 1;}while ((ch fgetc(pfread)) ! EOF){fputc(ch, pfwrite);}fclose(pfread);pfread NULL;fclose(pfwrite);pfwrite NULL;
}
效果如下 1.3 fgets和fputs的使用
假设此时text中有两行它们分别是 int main()
{char arr[20];FILE* pf fopen(text.txt, r);if (pf NULL){perror(fopen);return 1;}fgets(arr, 20, pf);printf(%s, arr);fclose(pf);pf NULL;return 0;
}
我们使用fgets从文件中获取信息注意fgets只会从指定文件中读取一行数据包括换行符也就是换行符是固定的我们读取20只会读取前十九个字符因为最后一个字符要存放换行符。
1.4 fprintf和printf的使用 假设我们定义了一个结构体如下所示那我们可以使用printf将其打印到屏幕上也可以使用fprintf将其打印至屏幕上或者将其写入文件中
struct S
{int n;float f;char arr[100];
};int main()
{struct S s { 100,3.14f,zhangsan };FILE* pf fopen(text.txt, w);if (pf NULL){perror(fopen);return 1;}//输出到屏幕上printf(%d %f %s\n, s.n, s.f, s.arr);fprintf(stdout, %d %f %s, s.n, s.f, s.arr);//使用fprintf输出到文件中fprintf(pf, %d %f %s\n, s.n, s.f, s.arr);fclose(pf);pf NULL;return 0;
}
效果如下 1.5 fscanf和scanf的使用
struct S
{int n;float f;char arr[100];
};int main()
{struct S s {0};FILE* pf fopen(text.txt, r);if (pf NULL){perror(fopen);return 1;}fscanf(pf,%d %f %s,(s.n), (s.f), (s.arr));printf(%d %f %s, s.n, s.f, s.arr);fclose(pf);pf NULL;return 0;
} 我们用fopen打开一个名为text.txt的文件来读取数据。如果打开成功你使用fscanf函数从文件中读取整数、浮点数和字符串存储到结构体s的相应成员中。注意在%s格式符后使用s.arr而不是操作符因为数组名本身就是数组的首地址
1.6 sscanf和sprintf的介绍和使用
在本文中我们将介绍C中两个常用的输入输出解析函数sscanf和sprintf。这两个函数提供了灵活的方式来处理字符串和变量之间的格式化输入输出操作。
sscanf函数 sscanf函数用于将字符串按照指定的格式解析并将解析后的值存储到对应的变量中。语法int sscanf(const char* str, const char* format, ...)str为输入的字符串format为格式化字符串...为对应的变量列表。
#include stdio.hint main() {const char* str 23.5 10;float f;int i;sscanf(str, %f %d, f, i);printf(解析出的浮点数为%.2f\n, f);printf(解析出的整数为%d\n, i);return 0;
}sprintf函数 sprintf函数用于将格式化的数据输出到字符串中。语法int sprintf(char* str, const char* format, ...)str为输出的字符串format为格式化字符串...为对应的变量列表。
#include stdio.hint main() {char str[100];int i 42;float f 3.14;sprintf(str, 整数%d浮点数%.2f, i, f);printf(格式化后的字符串%s\n, str);return 0;
}sscanf和sprintf函数是C语言中常用的输入输出解析函数可以方便地进行字符串的解析和格式化输出
1.7 fwrite和fread的使用 fwrite的使用
#include stdio.hint main()
{int arr[10] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };FILE* pf fopen(text.txt, wb);if (pf NULL){perror(fopen);return 1;}fwrite(arr, sizeof(int), 10, pf); // 写入整个数组fclose(pf);pf NULL;return 0;
}
我们可以在项目中用二进制形式查看这个txt文件 右键该文件选择打开方式选择底部的二进制编辑器 我们可以看到文件中写入了几个数 那如何验证我们是否写入了呢这时候我们就需要用到fread
int main()
{int arr[10] {0};FILE* pf fopen(text.txt, rb);if (pf NULL){perror(fopen);return 1;}fread(arr, sizeof(int), 10, pf); int i 0;for (i 0; i 10; i){printf(%d , arr[i]);}fclose(pf);pf NULL;return 0;
} 1.8 总结 二、文件的随机读写
C语言中的随机读写通常指的是以随机的方式访问文件中的数据而不是按顺序逐个读取或写入。这种随机的读写通常涉及到文件指针的定位可以根据需要在文件中的不同位置进行读写操作。 C语言提供了两个函数来进行文件的随机读写它们分别是fseek和ftell
2.1 fseek函数
fseek - C Reference (cplusplus.com) fseek 函数 函数原型 int fseek ( FILE * stream, long int offset, int origin ); 功能移动文件流中的读写位置进行随机的文件定位。参数 stream指向文件的指针。offset偏移量用于指定文件指针要移动的位置。origin指定起始位置可以取三个值SEEK_SET 文件的开始位置SEEK_CUR文件指针的当前位置SEEK_END文件的末尾位置返回值如果成功返回0否则返回非0值通常是-1。
fseek的使用fseek函数主要有三种origin的起始值 至于偏移量就是距离我的origin有多远了从1字节开始算
例如
假设我的text里存了CILMY23
#include stdio.hint main()
{FILE* pf fopen(text.txt, r);if (pf NULL){perror(fopen);return 1;}fseek(pf, 0, SEEK_SET);//Cchar ch fgetc(pf);printf(%c\n, ch);fseek(pf, -1, SEEK_END);//3ch fgetc(pf);printf(%c\n, ch);fseek(pf, -5, SEEK_CUR);//Lch fgetc(pf);printf(%c\n, ch);fclose(pf);pf NULL;return 0;
} 2.2 ftell函数 ftell - C Reference (cplusplus.com) ftell函数 原型 long int ftell ( FILE * stream ); 功能获取当前文件位置指针的偏移字节数。参数 stream指向文件的指针。返回值返回当前文件位置指针的偏移字节数。 例如
#include stdio.hint main()
{FILE* pf fopen(text.txt, r);if (pf NULL){perror(fopen);return 1;}fseek(pf, -1, SEEK_END);//3char ch fgetc(pf);printf(%c\n, ch);int ret ftell(pf);printf(%d, ret);fclose(pf);pf NULL;return 0;
}
三、文件读取结束的判定
文件读取结束可以通过feof函数进行判定。feof函数用于检测文件流上的结束标志。当文件末尾已经读取feof函数返回非零值否则返回0。 文件读取结束的原因可能有 1.文件遇到末尾 2.文件发生错误 #includestdio.hint main()
{FILE* pf fopen(text.txt, r);if (pf NULL){perror(fopen);return 1;}int ch;while ((ch fgetc(pf)) ! EOF){// 处理读取的字符if (feof(pf)){printf(文件读取结束\n);}else{printf(文件读取出错\n);}}fclose(pf);pf NULL;return 0;
} 所以在文件读取过程中不能用feof函数的返回值直接来判断文件的是否结束。feof 的作用是当文件读取结束的时候判断是读取结束的原因是否是遇到文件末尾结束 1. 文本文件读取是否结束判断返回值是否为EOFfgetc 或者NULLfgets 例如 • fgetc 判断是否为 EOF . • fgets 判断返回值是否为NULL . 2. 二进制文件的读取结束判断判断返回值是否小于实际要读的个数。 例如 • fread判断返回值是否小于实际要读的个数。 四、文件缓冲区
ANSIC标准采用“缓冲文件系统”处理的数据文件的所谓缓冲文件系统是指系统自动地在内存中为 程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据则从磁盘文件中读取数据输入到内存缓冲区充满缓冲区然后再从缓冲区逐个地将数据送到程序数据区程序变量等。缓冲区的大小根据C编译系统决定的。 因为有缓冲区的存在C语言在操作文件的时候需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做可能导致读写文件的问题。 通过本篇博客相信你了解了C语言中文件操作的核心内容。文件的顺序读写、随机读写、文件读取结束的判定以及文件缓冲区等知识点感谢你的阅读如果你对文件操作还有任何疑问或需要进一步的帮助请随时留言如果你觉得还不错的话可以给个一键三连点赞关注加收藏本篇博客就到此结束了。