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

企业微信 Webhook 回调详解

Webhook 回调&#xff0c;是企业微信自动化开发中最核心的能力之一。很多开发者在做企业微信自动化时&#xff0c;都会先关注“消息发送”。 但真正影响系统自动化能力的&#xff0c;其实是“消息回调”。因为只有实时接收到客户消息、群消息与事件通知&#xff0c;系统才能真正…...

从 LangChain 到 LangGraph:大语言模型应用开发框架极简史

大模型应用开发正经历一场静悄悄的革命——从“把LLM接进工作流”走向“为Agent构建操作系统”。作为这场革命的两大核心引擎,LangChain与LangGraph的故事,既是一部框架演进史,也是一部开发者认知升级史。 一、源起:一个框架的诞生与大模型开发的“蛮荒时代” 时间回到202…...

良心云用户如何快速接入Taotoken实现大模型API调用

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 良心云用户如何快速接入Taotoken实现大模型API调用 对于在良心云服务器上部署应用的开发者而言&#xff0c;将大模型能力集成到自己…...

如何快速掌握小程序UI组件库:Vant Weapp的5大优势与完整指南

如何快速掌握小程序UI组件库&#xff1a;Vant Weapp的5大优势与完整指南 【免费下载链接】vant-weapp 轻量、可靠的小程序 UI 组件库 项目地址: https://gitcode.com/gh_mirrors/va/vant-weapp Vant Weapp是一款轻量、可靠的小程序UI组件库&#xff0c;专为微信小程序开…...

游戏开发团队必须立即升级的语音合成栈:Llama-3-TTS开源模型实测对比(RTX 4090 vs. Snapdragon 8 Gen3)

更多请点击&#xff1a; https://codechina.net 第一章&#xff1a;AI语音合成在游戏开发中的应用 AI语音合成&#xff08;Text-to-Speech, TTS&#xff09;正深刻重塑游戏叙事、角色交互与本地化工作流。相比传统预录语音&#xff0c;实时TTS可动态生成符合上下文语境、情绪状…...

巴洛克光影建模失败率高达83%?用这7个构图锚点+12组权威艺术史关键词立即逆转

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;巴洛克光影建模的危机本质与历史断层 “巴洛克光影建模”并非真实存在的技术流派&#xff0c;而是对20世纪末至21世纪初三维渲染实践中一种高度装饰化、过度依赖手工打光与物理不一致材质叠加现象的隐喻性指称…...

FRED案例:矩形微透镜阵列

介绍小透镜阵列可应用在很多方面&#xff0c;其中包含光束均匀化。本文演示了一个用于在探测器上创建均匀的非相干照度的成像微透镜阵列的设计。输入光束具有高斯轮廓&#xff0c;半宽度等于微透镜阵列大小&#xff0c;并且显示了其功率轮廓被微透镜阵列消除掉。系统输出简单示…...

Perplexity习语查询响应延迟超800ms?3个冷启动配置错误正在 silently 毁掉你的语言生产力

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;Perplexity习语查询功能概览 Perplexity 的习语查询功能专为语言学习者与内容创作者设计&#xff0c;支持对英语中高频、多义、文化负载型习语进行上下文感知的精准解析。该功能不仅返回标准释义&#xff0c;还…...

Show-o2 3D Causal VAE空间:为文本、图像和视频模态提供可扩展解决方案

Show-o2 3D Causal VAE空间&#xff1a;为文本、图像和视频模态提供可扩展解决方案 【免费下载链接】Show-o [ICLR & NeurIPS 2025] Repository for Show-o series, One Single Transformer to Unify Multimodal Understanding and Generation. 项目地址: https://gitcod…...

Ai会不会让越来越多的开发者失去工作机会?

我不知道写这篇Log会不会太激进&#xff0c;可能会让人浮想联翩&#xff0c;对号入座。想想还是要写的&#xff0c;咱们不聊别的&#xff0c;仅仅是讨论一下AI是否真的会让我们这些写了20多年的代码的开发者失业&#xff0c;这还真是一个“悲伤”的讨论。朋友跟我说&#xff1a…...