C语言 文件操作(2)

目录

1.文件的顺序读写

2.文件的随机读写

3.文件读取结束的判定

4.文件的缓冲区


1.文件的读取顺序

1.1 顺序读写函数介绍

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流

一般指适用于标准输出流和其他输出流(如文件输出流)。

1.2 对比一组函数

  • scanf/fscanf/sscanf
  • printf/fprintf/sprintf

scanf/fscanf/sscanf:
 
- scanf
- 功能:从标准输入流(通常是键盘)读取数据 ,按照指定格式进行解析并存储到对应变量中。例如 scanf("%d", &num);  ,从键盘读取一个整数存入 num 变量。
- 特点:直接从标准输入获取数据,使用方便,但要注意输入格式与指定格式严格匹配,否则可能导致输入错误或程序异常。


- fscanf
- 功能:从指定的文件输入流中读取数据,按格式解析存储。如 fscanf(fp, "%d", &num);  ,从文件指针 fp 指向的文件中读取整数存到 num  。
- 特点:用于文件数据读取,可灵活处理文件中不同格式数据,但要先正确打开和操作文件。


- sscanf
- 功能:从字符串中读取数据,按格式解析存储。比如 sscanf(str, "%d", &num);  ,从字符串 str 中提取整数存到 num  。
- 特点:在处理已存在字符串中的数据时很有用,可方便地从字符串提取不同类型数据。
 
printf/fprintf/sprintf:
 
- printf
- 功能:向标准输出流(通常是控制台)按照指定格式输出数据。像 printf("The number is %d", num);  ,在控制台显示变量 num 的值。
- 特点:是最常用的输出方式,能快速将数据展示在屏幕上。


- fprintf
- 功能:向指定文件输出流写入数据,按格式输出。例如 fprintf(fp, "The number is %d", num);  ,将数据写入文件指针 fp 指向的文件。
- 特点:用于文件数据写入,可将程序数据按格式保存到文件中。


- sprintf
- 功能:将格式化数据写入字符串中。如 sprintf(str, "The number is %d", num);  ,把数据按格式存入字符串 str  。
- 特点:常用于字符串格式化构建,方便生成特定格式字符串用于后续处理。

2.文件的随机读写

2.1 fseek

根据文件指针的位置和偏移量来定位文件指针(文件内容的光标)。

 int fseek ( FILE * stream, long int offset, int origin );

例子:

/* fseek example */
#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;
}

2.2 ftell

返回文件指针相对于起始位置的偏移量

long int ftell ( FILE * stream );

例子:

/* ftell example : getting size of a file */
#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-portablesize=ftell (pFile);fclose (pFile);printf ("Size of myfile.txt: %ld bytes.\n",size);}return 0;
}

2.3 rewind

让文件指针的位置回到文件的起始位置

void rewind ( FILE * stream );

例子:

/* rewind example */
#include <stdio.h>int main ()
{int n;FILE * pFile;char buffer [27];pFile = fopen ("myfile.txt","w+");for ( n='A' ; n<='Z' ; n++)fputc ( n, pFile);rewind (pFile);fread (buffer,1,26,pFile);fclose (pFile);buffer[26]='\0';printf(buffer);return 0;
}

3.文件读取结束的判定

3.1 被错使用的feof

牢记: 在文件读取过程中, 不能用 feof 函数的返回值直接来判断文件的是否结束。

feof 的作用是: 当文件读取结束的时候, 判断读取结束的原因是否是: 遇到文件尾结束。

1. 文本文件读取是否结束,判断返回值是否为 EOF(fgetc),或者 NULL(fgets)

例如:

- fgetc 判断是否为 EOF .

- fgets 判断返回值是否为 NULL .
 
2. 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

例如:

 - fread判断返回值是否小于实际要读的个数。

 文本文件的例子:

#include <stdio.h>
#include <stdlib.h>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) // 标准C I/O读取文件循环{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 { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

4.文件缓冲区

ANSI C标准采用“缓冲文件系统”处理数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程

序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲

区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输

入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。

缓冲区的大小根据C编译系统决定的。

#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语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文

件,如果不做,可能导致读写文件的问题。

关于文件操作的所有内容到这就已经完了,下期我们讲解编译和链接部分相关的内容,感谢大家的

观看!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QGIS新手教程2:线图层与多边形图层基础操作指南(点线互转、中心点提取与WKT导出)

QGIS新手教程&#xff1a;线图层与多边形图层基础操作指南&#xff08;点线互转、中心点提取与WKT导出&#xff09; 目录 QGIS新手教程&#xff1a;线图层与多边形图层基础操作指南&#xff08;点线互转、中心点提取与WKT导出&#xff09;&#x1f4cc; 引言第一部分&#xff1…

Netty 框架介绍

1. Netty 框架介绍 Netty 是一个基于 Java NIO&#xff08;Non-blocking I/O&#xff09;的异步事件驱动网络应用框架&#xff0c;旨在快速开发高性能、高可靠性的网络服务器和客户端。它简化了 TCP/UDP 等协议的编程&#xff0c;并提供了高度可定制的组件&#xff0c;适用于高…

Eclipse 插件开发 5.2 编辑器 获取当前编辑器

Eclipse 插件开发 5.2 编辑器 获取当前编辑器 1 获取活跃编辑器2 获取全部编辑器 Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Click1 Bundle-SymbolicName: com.xu.click1;singleton:true Bundle-Version: 1.0.0 Bundle-Activator: com.xu.click1.Activato…

完成LRU页面调度算法的模拟

目录 1.上代码 2.实现思路 1.上代码 #include<iostream> using namespace std; //内存块类 class memory { public:void init();void alter(int a, int b);int check_full();int check_old();int check_exist(int a);void run();void refresh();friend int manage(me…

Three.js 直线拐角自动圆角化(圆弧转弯)

目录 前言 计算圆心坐标 计算两条直线的角平分线 计算dir1 dir2的夹角 计算圆心到直线交点的距离 计算圆心 计算从正X轴算起曲线开始、终止的角度 计算垂足与两直线交点距离 计算垂足 计算垂线 计算两垂线与x轴的夹角 ​编辑 计算圆弧是否按照顺时针方向来绘制 成功…

【MYSQL】mysql单表亿级数据查询优化处理

1、实践表明mysql单表数据超过一亿后&#xff0c;数据进行交并差效率会非常慢&#xff0c;所以这时候就要进行表的优化。 我这里主要是使用索引。 2、表字段精量精简 查索引&#xff0c;建索引&#xff0c;删索引语法 --查看索引 -- SHOW INDEX FROM 表名; -- 删除索引 --AL…

C++基础:模拟实现vector(有存在深层次的浅拷贝问题)

目录 引言 一、vector的基本框架 二、尾插push_back、reserve扩容、任意位置插入insert&#xff08;增&#xff09; 1.reserve扩容 2.push_back尾插 3.深层次的浅拷贝问题 4. 任意位置插入数据insert(会使迭代器失效) 三、构造、析构、拷贝构造函数 1.构造函数 1.1无…

【力扣】关于链表索引

怎么才能走到目标节点呢&#xff1f; 从9走到2&#xff0c;需要2步&#xff0c;他们的索引分别是&#xff1a;0&#xff0c;2 在for循环里&#xff1a;int i 0; i < 2; i i的范围是【0&#xff0c;2&#xff09; 有&#xff1a;2 2 - 0 如果从虚拟头节点开始走到2&#x…

C++ ODB框架详解:现代C++对象关系映射解决方案

目录 框架简介安装与配置基础概念实体映射数据库操作查询操作高级功能性能优化最佳实践 框架简介 ODB&#xff08;Object-Relational Database&#xff09;是一个专为C设计的对象关系映射&#xff08;ORM&#xff09;框架&#xff0c;由CodeSynthesis公司开发。它提供了一种…

Ai书签管理工具开发全记录(一):项目总览与技术蓝图

文章目录 Ai书签管理工具开发全记录&#xff08;一&#xff09;&#xff1a;项目总览与技术蓝图 ✨1. 项目背景与核心价值 &#x1f4a1;1.1. 核心特点 2. 技术架构分析 &#x1f3d7;️功能架构全景图典型工作流 3. 核心技术栈选择 &#x1f6e0;️4. 预期使用功能说明 &#…

GUI 编程——python

GUI 编程核心概念 GUI&#xff08;图形用户界面&#xff0c;Graphical User Interface&#xff09; 是一种通过图形元素&#xff08;窗口、按钮、菜单等&#xff09;与用户交互的应用程序形式&#xff0c;相比命令行界面更直观易用。以下是学习 GUI 编程的基础概念和流程&…

【Doris基础】Apache Doris 基本架构深度解析:从存储到查询的完整技术演进

目录 1 引言 2 Doris 架构全景图 2 核心组件技术解析 2.1 Frontend 层&#xff08;FE&#xff09; 2.2 Backend 层&#xff08;BE&#xff09; 3 数据存储与复制机制 3.1 存储架构演进 3.2 副本复制策略 4 查询处理全流程解析 4.1 查询生命周期 5 高可用设计 5.1 F…

光电赋能低空场景,灵途科技助力无人机持续升级

2025 UASE 主题为“步入低空经济新时代”的“2025第九届世界无人机大会暨国际低空经济与无人系统博览会/第十届深圳国际无人机展览会”5月23日在深圳会展中心隆重开幕。本届展会汇聚了全球800余家企业参展&#xff0c;展示5000多款无人机及系统设备&#xff0c;全面呈现低空经…

iOS QQ抽屉式导航的实现

QQ个人中心的侧滑功能(通常称为"抽屉式导航")可以通过以下几种方式在iOS中实现&#xff1a; 主要实现方案 使用第三方库 最快速的方式是使用成熟的第三方库&#xff1a; SWRevealViewController&#xff1a;最流行的侧滑菜单库MMDrawerController&#xff1a;另一…

【Pandas】pandas DataFrame drop

Pandas2.2 DataFrame Reindexing selection label manipulation 方法描述DataFrame.add_prefix(prefix[, axis])用于在 DataFrame 的行标签或列标签前添加指定前缀的方法DataFrame.add_suffix(suffix[, axis])用于在 DataFrame 的行标签或列标签后添加指定后缀的方法DataFram…

长短期记忆网络 (LSTM) 详解:从原理到应用

一、引言&#xff1a;序列数据处理的挑战​ 在自然语言处理、语音识别、时间序列分析等领域&#xff0c;数据通常以序列形式存在&#xff0c;前后数据点之间存在依赖关系。传统循环神经网络 (RNN) 虽然能捕捉序列依赖&#xff0c;但存在严重的梯度消失 / 爆炸问题&#xff0c;…

三天掌握PyTorch精髓:从感知机到ResNet的快速进阶方法论

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 一、分析式AI基础与深度学习核心概念 1.1 深度学习三要素 数学基础&#xff1a; f(x;W,b)σ(Wxb)(单层感知机) 1.2 PyTorch核心组件 张量操作示例…

Linux操作系统概述

一、操作系统的作用 1、五大基本功能 &#xff08;1&#xff09;进程和线程的管理&#xff1a;进程线程的状态、控制、同步互斥、通信调度等 (2&#xff09;存储管理&#xff1a;分配/回收、地址转换、存储保护等 (3&#xff09;文件管理&#xff1a;文件目录、文件操作、磁盘…

Python爬虫第22节- 结合Selenium识别滑动验证码实战

目录 一、引言 二、滑动验证码原理与反爬机制 2.1 验证码原理 2.2 反爬机制 三、工程实战&#xff1a;滑动验证码识别全流程 3.1 工程准备 3.1.1 环境依赖 3.1.2 目标网站与验证码识别案例 3.2 核心破解流程 3.2.1 自动化打开网页与登录 3.2.2 获取验证码图片&#…

NSSCTF-[NISACTF 2022]huaji?

下载附件得到文件 放到kali里面看看 发现是一张图片 用binwalk命令对其进行分离 发现需要密码 用010打开图片进行查看 对其进行解密 分别得到 ctf_NISA_2022 nisa_2022 发现ctf_NISA_2022是密码 得到flag NSSCTF{Nls_FumYEnnOjy}