当前位置: 首页 > news >正文

C++ 第10章 对文件的输入输出

https://www.bilibili.com/video/BV1cx4y1d7Ut/?p=147&spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=e8984989cddeb3ef7b7e9fd89098dbe8
🍁🍁🍁本篇为贺宏宏老师C语言视频教程文件输入输出部分笔记整理🍁🍁🍁

C++ 第10章笔记 对文件的输入输出

  • 第10章 对文件的输入输出
    • 10-1 文件基本概念 10-2 文件类型指针
    • 10-3 创建和打开文件 10-4 创建文件并写入字符串
    • 10-5 文件打开失败的原因
    • 10-6 从键盘读取数据到文件
    • 10-7 从文件读取字符串
    • 10-8 文本文件复制
    • 10-9 写学生二进制文件
    • 10-10 读学生二进制文件信息 (从二进制文件读取学生信息并输出到屏幕)
    • 10-11 随机读写原理
    • 10-12 随机读写函数fseek说明
    • 10-13 读取指定学生信息

第10章 对文件的输入输出

//操作系统把各种设备都统一作为文件来处理: //从操作系统的角度看,每一个与主机相连的输入输出设备都看作一个文件。
//eg.终端键盘是输入文件,显示屏和打印机是输出文件

//什么是输入,什么是输出? //内存->外存(硬盘):输入?输出?输出流 //外村(硬盘)->内存:输入?输出?输入流

//什么是内存,什么是外存? //内存:所有使用的数据都在内存 //外存:所有需要保存的数据都在外存

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

10-1 文件基本概念 10-2 文件类型指针

‘\0’:是字符串的结尾标记,但在文件中是不可见的或者用NUL表示('\0’对于文件而言不重要) 文件:

1.文件概念
输入流:外存(硬盘)->内存 eg.从硬盘打开一本书/播放一首音乐/电影
输出流:内存->外存(硬盘):eg.保存文档;下载
输入设备:触摸屏,触摸板,鼠标,键盘(标准输入设备)
输出设备:屏幕(标准输出设备),打印机
文件分类:
文本(ASCII)文件:能直接查看的文件,都是文本(字符)数据,需要做转换
二进制文件:不能直接查看的,都是二进制数据,直接把内存的数据保存到外存,不做转换。

2.文件基本操作
文件类型指针:file *,文件操作中的唯一凭证
操作函数:
打开fopen,一定要注意文件路径中\的写法.例如:“D:\1.txt”
关闭fclose,
写数据fwrite,把内存的数据往文件中写 .fputc
读数据fread,从文件中读数据到内存,返回值很重要
fseek:改变文件读写位置标记

10-3 创建和打开文件 10-4 创建文件并写入字符串

//fopen:打开文件,一定注意文件路径中\的写法.例如"D:\1.txt"
//创建1.txt文件,"r"读:打开以便读取。如果文件不存在或找不到,fopen调用将失败
// "w"写:如果文件不存在,则创建;如果存在,则代替
// "a"写:在文件末尾打开以进行写入(追加),在新数据写入到文件之前不移除文件末尾标记。创建文件(如果文件不存在)。
// “b”:在二进制(未转换)模式下打开;不进行涉及回车和换行字符的转换

int main()
{printf("D:\\1.txt");//在字符串中\表示转义字符,如果需要表示'\'本身,必须写成'\\'FILE *fw = fopen("D:\\1.txt","w");const char* str = "hello hhhhhhh";//fwrite(str,sizeof(char),strlen(str),fw);fwrite(str,sizeof(char),strlen(str)+1,fw);//fopen("D:\\1.txt","r");//文件不会跳出fclose(fw);return 0;
}

10-5 文件打开失败的原因

int main()
{FILE* fw = fopen("D:\\1.txt","w");//写打开失败,1.文件不存在; 2.文件路径错误FILE* fr = fopen("D:\1.txt","r");//读打开失败,文件不存在if(fw == NULL){printf("打开文件失败,请检查文件路径是否正确\n");return 0;}
}

10-6 从键盘读取数据到文件

//怎样向文件读写字符:从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个"#"为止

int main()
{FILE* fw = fopen("D:\\1.txt","w");//写打开if(fw == NULL){printf("打开文件失败,请检查文件路径是否正确\n");return 0;}char ch;while((ch = getchar())!= '#')//!!!不要键入中文,会出现乱码的情况{//fwrite(&ch,sizeof(char),1,fw);//,用fwrite的次数会比fputc多,建议使用fwrite函数fputc(ch,fw);//只能输出字符}fclose(fw);return 0;
}

10-7 从文件读取字符串

int main()
{FILE *fr = fopen("D:\\1.txt","r");if(fr = NULL){printf("打开文件失败,请检查文件路径是否正确\n");return 0;}//char buffer[100];//存放读取的数据,错误,因为最后没有\0char buffer[100] = "";//这样写输出的是字符串了//参数:1.buffer:数据的存储位置 2.size:单个项目大小(以字节为单位) 3.count:尧都区项目的最大数量 4.stream:指向FILE结构的指针//返回值:返回实际读取的完整项目数,可能小于count;如果出错,或如果在到达之前遇到文件结束countint len = fread(buffer,sizeof(char),100,fr);printf("%d,%s\n",len,buffer);fclose(fr);
}

10-8 文本文件复制

//将一个磁盘文件中的数据复制到另一个磁盘文件中。
//今要求将上例建立的file1.dat文件中的内容复制到另一个磁盘文件file2.dat中 //(file put char)
fputc:往文件写一个字符 //(file get char) fgetc:从文件读一个字符

int main()
{FILE *fr = fopen("D:\\file1.dat","r");FILE *fw = fopen("D:\\file2.dat","w");if(fr == NULL || fw == NULL){printf("打开文件失败,请检查文件路径是否正确");return 0;}char ch;//从fr读数据到fw,EOF指示错误或者文件结尾。//while((ch=fgetc(fr))!=EOF)//{//  fputc(ch,fw);//}while(fread(&ch,sizeof(char),1,fr)>0){fwrite(&ch,sizeof(char),1,fw);}fclose(fw);fclose(fr);return 0;
}

10-9 写学生二进制文件

从键盘输入10个学生的有关数据,然后把它们转存到磁盘文件上去

typedef struct Student
{char name[20];//姓名int num;//学号int age;//年龄char addr[100];//家庭住址
}Student;//从键盘获取n个学生信息,存放到arr数组
void Input(Student *arr,int n)
{printf("请输入%d个学生信息:\n",n);printf("姓名 学号 年龄 地址\n");for(int i =0; i < n; i++){scanf("%s %d %d %s",&arr[i].name,&arr[i].num,&arr[i].age,&arr[i].addr);}
}//把arr的数据保存到文件
void Save(Student *arr,int n)
{//1.打开文件FILE* fw = fopen("1.txt","wb");//相对路径,1.txt和当前源文件在同一个文件夹. b:二进制if(fw == NULL){printf("打开文件失败");return;//退出函数(没有返回值)}//2.把数据写入文件//for(int i = 0; i < n; i++)//{//   fwrite(&arr[i],sizeof(Student),1,fw);//1,写一次//}fwrite(arr,sizeof(Student),n,fw);//3.关闭文件fclose(fw);
}

输入:

abc 123 26 252
abc 123 26 252
abc 123 26 252
abc 123 26 252
abc 123 26 252
abc 123 26 252
abc 123 26 252
abc 123 26 252
abc 123 26 252
abc 123 26 252

读写二进制数据

int main()
{Student stu[10];int len = sizeof(stu)/sizeof(stu[0]);//长度Input(stu,len);//从键盘读取数据Save(stu,len);return 0;
}

10-10 读学生二进制文件信息 (从二进制文件读取学生信息并输出到屏幕)

typedef struct Student
{char name[20];//姓名int num;//学号int age;//年龄char addr[100];//家庭住址
}Student;void Show()
{FILE* fr = fopen("1.txt","rb");if(fr == NULL){printf("打开文件失败,请检查路径\n");return;//提前结束函数}Student stu;//保存从文件读取的数据while(fread(&stu,sizeof(Student),1,fr)>0)//从文件不停的读取数据{//把stu的数据输出到屏幕printf("%s %d %d %s\n",stu.name,stu.num,stu.age,stu.addr);}fclose(fr);
}int main()
{Show();return 0;
}

10-11 随机读写原理

文件读写位置标记(简称文件位置标记或文件标记),类似图形界面里面的光标,读写时,自动移动。用来指示"接下来要读写的下一个字符的位置"。

一般情况下,在对字符文件进行顺序读写时,文件位置标记指向文件开头,
这时如果对文件进行读/写的操作,就读/写完第1个字符后,文件位置标记顺序向后移一个位置,
在下一次执行读/写操作时,就将位置标记指向第2个字符进行读出或写入。以此类推,直到文件尾,此时文件位置标记在最后一个数据之后。

顺序读写:
随机读写的原理:改变文件读写位置标记(光标) 使用fseek函数

10-12 随机读写函数fseek说明

fseek的简单应用:把D:\1.txt文件的内容(前提是有该文件,并有内容),读两遍并输出到屏幕

int main()
{FILE* fr = fopen("D:\\1.txt","r");if(fr == NULL){printf("打开文件失败\n");return -1;}char buf1[100] = "";int len1;char buf2[100] = "";int len2;//错误写法://len1 = fread(buf1,sizeof(char),100,fr);//len2 = fread(buf2,sizeof(char),100,fr);//第二次读取为空,原因是已经到达文件末尾//printf("%d,%s",len1,buf1);//printf("%d,%s",len2,buf2);//正确写法://可用fseek函数将光标移到文件开头,这样第二次读取就不为空了//fseek参数:1.指向FILE结构的指针 2.距离初始点的字节数 3.初始点的位置:SEEK_CUR:当前位置/SEEK_END: 文件末尾/SEEK_SET文件开头len1 = fread(buf1,sizeof(char),100,fr);//fseek(fr,0,SEEK_SET);//以文件开头作为参照点//fseek(fr,-len1,SEEK_CUR);//当前文件位置指针作为参照点,往左len1个字节,正的是往右,负的是往左fseek(fr,-len1,SEEK_END);//以文件末尾作为参照点,往左len1个字节len2 = fread(buf2,sizeof(char),100,fr);//第二次读取为空,原因是已经到达文件末尾printf("%d,%s",len1,buf1);printf("%d,%s",len2,buf2);return 0;
}

10-13 读取指定学生信息

//在磁盘文件上存有10个学生的数据。
//要求将第1,3,5,7,9个学生数据输入计算机,并在屏幕上显示出来。

typedef struct Student
{char name[20];//姓名int num;//学号int age;//年龄char addr[100];//家庭住址
}Student;int main()
{FILE* fr = fopen("1.txt","rb");if(fr == NULL){printf("打开文件失败,请检查文件路径\n");return -1;} Student stu;int len;for(int i = 0; i < 5; i++)//读5个学生的信息{len = fread(&stu,sizeof(Student),1,fr);if(len < 1){printf("文件结束了\n");break;}printf("%s,%d,%d,%s\n",stu.name,stu.num,stu.age,stu.addr);fseek(fr,sizeof(Student),SEEK_CUR);//跳过一个学生的信息}fclose(fr);return 0;
}

相关文章:

C++ 第10章 对文件的输入输出

https://www.bilibili.com/video/BV1cx4y1d7Ut/?p147&spm_id_from333.1007.top_right_bar_window_history.content.click&vd_sourcee8984989cddeb3ef7b7e9fd89098dbe8 &#x1f341;&#x1f341;&#x1f341;本篇为贺宏宏老师C语言视频教程文件输入输出部分笔记整理…...

【机器学习】手写数字识别的最优解:CNN+Softmax、Sigmoid与SVM的对比实战

一、基于CNNSoftmax函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 二、 基于CNNsigmoid函数进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分析 三、 基于CNNSVM进行分类 1数据集准备 2模型设计 3模型训练 4模型评估 5结果分…...

android 聊天界面键盘、表情切换丝滑

1、我们在聊天页面时候&#xff0c;往往会遇到&#xff0c;键盘、表情、其他选择切换时候页面会出现掉下来再弹起问题&#xff0c;这是因为&#xff0c;我们切换时候&#xff0c;键盘异步导致内容View高度变化&#xff0c;页面掉下来后&#xff0c;又被其他内容顶起这种很差视觉…...

Web项目图片视频加载缓慢/首屏加载白屏

Web项目图片视频加载缓慢/首屏加载白屏 文章目录 Web项目图片视频加载缓慢/首屏加载白屏一、原因二、 解决方案2.1、 图片和视频的优化2.1.1、压缩图片或视频2.1.2、 选择合适的图片或视频格式2.1.3、 使用图片或视频 CDN 加速2.1.4、Nginx中开启gzip 三、压缩工具推荐 一、原因…...

关于Git分支合并,跨仓库合并方式

关于Git合并代码的方式说明 文章目录 关于Git合并代码的方式说明前情提要开始合并方式一&#xff1a;git merge方式二&#xff1a;git cherry-pick方式三&#xff1a;git checkout Git跨仓库合并的准备事项前提拉取源仓库代码 前情提要 同仓库不同分支代码的合并可直接往下看文…...

[网络] UDP协议16位校验和

16位校验和是udp报头中的一个字段,绝大多数的教材和网课都会忽略这个字段,不去细究,我闲的蛋疼问了问ai,得到了一个答案,故作此文,以证明我爱学习之心惊天地泣鬼神(狗头 ai的回答 仅从作用来说,它会根据整个应用层报文进行运算,生成一个准确的数字,这个数字不能保证唯一性,但根…...

Vue 3 中的 `update:modelValue` 事件详解

在 Vue 3 中&#xff0c;update:modelValue​ 事件通常与 v-model​ 指令一起使用&#xff0c;以实现自定义组件的双向数据绑定。以下是对该事件的详细分析&#xff1a; 事件定义 首先&#xff0c;我们需要在组件中定义 update:modelValue​ 事件。可以使用 defineEmits​ 函…...

vue3+vite+ts 使用webrtc-streamer播放海康rtsp监控视频

了解webrtc-streamer webrtc-streamer 是一个使用简单机制通过 WebRTC 流式传输视频捕获设备和 RTSP 源的项目&#xff0c;它内置了一个小型的 HTTP server 来对 WebRTC需要的相关接口提供支持。相对于ffmpegflv.js的方案&#xff0c;延迟降低到了0.4秒左右&#xff0c;画面的…...

QT数据库(四):QSqlRelationalTableModel 类

关系数据库概念 例如下列departments、majors、studInfo 这 3 个数据表之间存在关系。 主键与外键 标记“**”的是主键字段&#xff0c;标记“*”的是外键字段。主键字段是一个数据表中表示记录唯一性的字段&#xff0c;例如 studInfo 数据表中的 studID 字段。外键字段是与其…...

蓝桥杯刷题——day5

蓝桥杯刷题——day5 题目一题干解题思路一代码解题思路二代码 题目二题干解题思路代码 题目一 题干 给定n个整数 a1,a2,⋯ ,an&#xff0c;求它们两两相乘再相加的和&#xff0c;即&#xff1a; 示例一&#xff1a; 输入&#xff1a; 4 1 3 6 9 输出&#xff1a; 117 题目链…...

YOLO11改进-模块-引入多尺度差异融合模块MDFM

遥感变化检测&#xff08;RSCD&#xff09;专注于识别在不同时间获取的两幅遥感图像之间发生变化的区域。近年来&#xff0c;卷积神经网络&#xff08;CNN&#xff09;在具有挑战性的 RSCD 任务中展现出了良好的效果。然而&#xff0c;这些方法未能有效地融合双时相特征&#x…...

vlan和vlanif

文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法&#xff0c;vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…...

Apache Kylin最简单的解析、了解

官网&#xff1a;Overview | Apache Kylin 一、Apache Kylin是什么&#xff1f; 由中国团队研发具有浓厚的中国韵味&#xff0c;使用神兽麒麟&#xff08;kylin&#xff09;为名 的一个OLAP多维数据分析引擎:&#xff08;据官方给出的数据&#xff09; 亚秒级响应&#xff…...

MySQL——连接

一.引入库 我们已经分享了很多通过命令行方式去操作数据库&#xff0c;那么数据库该怎么通过语言去访问呢&#xff1f; 这里分享怎么通过C/C来连接数据库。 首先需要到MySQL官网&#xff0c;下载专门用于C/C连接数据库的库&#xff0c;但是一般不需要再去官网下载。 因为在…...

前端微服务实战:大型应用的拆分与治理

"这个系统已经无法维护了..."周五的架构评审会上,我盯着屏幕上那张错综复杂的依赖关系图发愁。作为一个运行了三年的企业级中后台系统,代码量已经超过 50 万行,构建时间长达 40 分钟,任何修改都可能引发连锁反应。 更让人头疼的是,随着业务的快速发展,不同业务线之间…...

Linux shell的七大功能 --- history

1.直接输入“history” 这个命令可以显示出曾经使用过的命令&#xff08;最近时间的500条&#xff09; history 2.“history”命令也可以搭配其他命令一起使用。 例&#xff1a;history | grep "vim"&#xff0c;找出所有包含“vim”的记录&#xff1b; 也可以搭配…...

C++ webrtc开发(非原生开发,linux上使用libdatachannel库)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、libdatachannel库的下载和build二、开始使用 1.2.引入库3.开始使用 总结 前言 使用c开发webrtc在互联网上留下的资料甚少&#xff0c;经过我一段时间的探…...

C语言刷题

1. 题目描述 根据给出的三角形3条边a:b.c(a.b,c<100.000)&#xff0c;计算三角形的周长和面积。 输入描述: 一行&#xff0c;三角形3条边(能构成三角形)&#xff0c;中间用一个空格隔开. 输出描述: 一行&#xff0c;三角形周长和面积保留两位小数&#xff0c;中问用一个空…...

LabVIEW实现RFID通信

目录 1、RFID通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...

Linux 网络流量控制 - 实现概述

摘要 Linux 提供了一整套丰富的流量控制(traffic control)功能。本文档概述了相应的内核代码设计&#xff0c;描述了其结构&#xff0c;并通过描述一种新的排队策略来说明新元素的添加。 1 引言 最近的Linux内核提供了多种流量控制功能。Alexey Kuznetsov&#xff08;kuznet…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

全志A40i android7.1 调试信息打印串口由uart0改为uart3

一&#xff0c;概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本&#xff1a;2014.07&#xff1b; Kernel版本&#xff1a;Linux-3.10&#xff1b; 二&#xff0c;Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01)&#xff0c;并让boo…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)

本期内容并不是很难&#xff0c;相信大家会学的很愉快&#xff0c;当然对于有后端基础的朋友来说&#xff0c;本期内容更加容易了解&#xff0c;当然没有基础的也别担心&#xff0c;本期内容会详细解释有关内容 本期用到的软件&#xff1a;yakit&#xff08;因为经过之前好多期…...

SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)

上一章用到了V2 的概念&#xff0c;其实 Fiori当中还有 V4&#xff0c;咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务)&#xff0c;代理中间件&#xff08;ui5-middleware-simpleproxy&#xff09;-CSDN博客…...

Webpack性能优化:构建速度与体积优化策略

一、构建速度优化 1、​​升级Webpack和Node.js​​ ​​优化效果​​&#xff1a;Webpack 4比Webpack 3构建时间降低60%-98%。​​原因​​&#xff1a; V8引擎优化&#xff08;for of替代forEach、Map/Set替代Object&#xff09;。默认使用更快的md4哈希算法。AST直接从Loa…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

DBLP数据库是什么?

DBLP&#xff08;Digital Bibliography & Library Project&#xff09;Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高&#xff0c;数据库文献更新速度很快&#xff0c;很好地反映了国际计算机科学学术研…...

Linux 下 DMA 内存映射浅析

序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存&#xff0c;但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程&#xff0c;可以参考这篇文章&#xff0c;我觉得写的非常…...

jdbc查询mysql数据库时,出现id顺序错误的情况

我在repository中的查询语句如下所示&#xff0c;即传入一个List<intager>的数据&#xff0c;返回这些id的问题列表。但是由于数据库查询时ID列表的顺序与预期不一致&#xff0c;会导致返回的id是从小到大排列的&#xff0c;但我不希望这样。 Query("SELECT NEW com…...