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

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...