当前位置: 首页 > 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…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...