C++中IO类的基本解析

2023-11-03


在这里插入图片描述
  上图展示了C++中文件IO设计类的基本关系,从中我们可以看出,标准输入与文件输入类继承于同一个基类,标准输出与文件输出类继承于同一个基类。下面针对C++中IO类的一些特性进行介绍。

  c++的输入与输出包括以下三个部分:

  1. 对系统制定的标准设备的输入和输出,称为标准 I/O(设备);
  2. 以磁盘文件为对象进行输入和输出,称为文件 I/O(文件);
  3. 对内存中指定的空间进行输入和输出,称为串 I/O(内存);

  其中标准I/O如下:

  • cin :标准输入流,从键盘输入。
  • cout :标准输出流,输出到屏幕。

  标准I/O的细节这里不再做过多介绍,我们主要了解文件输入输出。

文件输入输出

  文件输入类为iostream,文件输出类为ofstream,和标准I/O的不同在于,文件I/O是从文件输入,输出到文件,在进行文件读写时,一般包括以下几个步骤:

  1. 打开文件。
  2. 状态检测。
  3. 文件读写。
  4. 文件关闭。

  以下是文件读写的示例:

#include <fstream>
#include <iostream>

int main()
{
    using namespace std;

    char automobile[50];
    int year;
    double a_price;
    double d_price;

    ofstream outFile;
    outFile.open("carinfo.txt");
    if (!outFile.is_open())
        return 0;

    cout << "Enter the make and model of automobile:";
    cin.getline(automobile, 50);
    cout << "Enter the model year:";
    cin >> year;
    cout << "Enter the original asking price:";
    cin >> a_price;

    d_price = 5 * a_price;

    //display information on srceen with cout

    cout << fixed;
    cout.precision(2);
    cout.setf(ios_base::showpoint);
    cout << "Make and model:" << automobile << endl;
    cout << "Year:" << year << endl;
    cout << "Was asking" << a_price << endl;
    cout << "Now aksing" << d_price << endl;

    //now do exact same things using outFile instead of cout
    outFile << fixed;
    outFile.precision(2);              //用两位小数显示输出
    outFile.setf(ios_base::showpoint); //强制显示小数点输出
    outFile << "Make and Model:" << automobile << endl;
    outFile << "Year:" << year << endl;
    outFile << "Was asking:" << a_price << endl;

    outFile.close();

    //read data from file
    ifstream inFile("carinfo.txt");
    if (!inFile.is_open())
        return 0;

    string str;
    cout << "read data from file:" << endl;

    while (getline(inFile, str))
        // while (inFile >> str)
        cout << str << endl;

    if (inFile.eof())
        cout << "End of file reached.\n";
    else if (inFile.fail())
        cout << "Input terminated by data mismatch.\n";
    else
        cout << "Input terminated for unknown reason.\n";

    return 0;
}

  打开文件时,主要有以下模式:
在这里插入图片描述
  针对文件读取得时候,可以使用以下函数进行判断:

  • good:读取正常。
  • eof:到达文件尾部。
  • fail:类型不匹配(例如我们从文件中依次读取赋给int类型,则以空格作为结束,当类型不匹配时,返回)。
  • bad: 文件受损或硬件故障。

  需要注意的是,我们也可以使用下述方式进行读写正常判断:

while(inFile >> value) //或者getline(inFile, str)
{
	...
}

  因为这种读取函数只有两个结果,要么true,要么false,所以我们可以直接判断。

缓冲区

  每个输出流都有一个缓冲区,用来保存程序读写的数据,如果我们执行文本打印操作,那么文本可能立即打印,也可能不立即打印,此时文本就被保存到了缓冲区;
  文本缓冲区之所以存在,是因为设备的读写操作可能都很耗时,允许操作系统将多个输出操作合二为一可以带来性能提升;
  如果我们不想使用缓冲,那么就必须进行缓冲刷新,以下方式可以导致刷新:

  1. 程序正常结束;
  2. 缓冲区满时;
  3. 使用操作符 endl;
  4. 使用 flush;

Note:如果程序崩溃,那么输出缓冲区是不会被刷新的,可能存在这样一种情况:我们通过输出调试信息调试程序,但程序正好崩溃,但实际输出可能已经执行,之所以没有打印只是因为没有缓冲区没有被刷新而已;

参考链接:C++中的流

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中IO类的基本解析 的相关文章

  • 向进度条添加百分比文本 C#

    我有一个方法可以显示进程栏何时正在执行以及何时成功完成 我工作得很好 但我想添加一个百分比 如果完成 则显示 100 如果卡在某个地方 则显示更少 我在网上做了一些研究 但我无法适应我正在寻找的解决方案 这是我的代码 private voi
  • 每个托管线程是否都有自己对应的本机线程?

    我想知道是否在 Net 中创建托管线程 通过调用Thread Start 导致在后台创建一个本机线程 那么托管线程是否有对应的本机线程呢 如果是 当托管线程等待或睡眠时 是否意味着相应的本机线程也在等待或睡眠 是的 NET 线程映射到所有当
  • 如何在c++中读取pcap文件来获取数据包信息?

    我想用 C 编写一个程序来读取 pcap 文件并获取数据包的信息 例如 len sourc ip flags 等 现在我找到了如下代码 我认为它会帮助我获取信息 但是我有一些疑问 首先我想知道应该将哪个库添加到我的程序中 然后什么是 pca
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 回发后刷新时提示确认表单重新提交。我做错了什么?

    我有一个以空白 默认状态启动的仪表板 我让用户能够将保存的状态加载到仪表板中 当他们单击 应用 按钮时 我运行以下代码 function CloseAndSave var radUpload find radUpload1ID var in
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Azure 辅助角色“请求输入之一超出范围”的内部异常。

    我在辅助角色中调用 CloudTableClient CreateTableIfNotExist 方法 但收到一个异常 其中包含 请求输入之一超出范围 的内部异常 我做了一些研究 发现这是由于将表命名为非法表名引起的 但是 我尝试为我的表命
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 使用管道时,如果子进程数量大于处理器数量,进程是否会被阻塞?

    当子进程数量很大时 我的程序停止运行 我不知道问题是什么 但我猜子进程在运行时以某种方式被阻止 下面是该程序的主要工作流程 void function int process num int i initial variables for
  • 为什么 gcc 抱怨“错误:模板参数 '0' 的类型 'intT' 取决于模板参数”?

    我的编译器是gcc 4 9 0 以下代码无法编译 template
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • vue获取当前时间并时时刷新

    vue获取当前时间并时时刷新 页面显示 div span nowDate span span class houertime hourDate span div 图片上传失败 我是分开年月日和时分秒 给时分秒加样式 2022 11 24 1
  • [windows优化]win10折腾过程

    2018 11 27更新 没固态硬盘 拯救者还不值3000 非常卡 双十一 终于忍不住买了块固态硬盘 刚好最近技术发展 固态硬盘降价了 入手三星750 M 2 250G 如果机子不能识别固态硬盘 请进入BIOS 设置启动模式为UEFI 进入
  • CPU眼里的: MMU

    一 MMU与空间独立性 内存管理单元 memory management unit P1P2为两个进程 它们之间存在空间独立性 p1与p2的a虽然同一虚拟内存 但经过MMU会映射在物理内存的不同地址 真正的物理内存空间就是天空 每个进程就是
  • adas记录仪app_4K旗舰丨盯盯拍MINI5智能行车记录仪荣耀新生!

    2020年5月19日 盯盯拍MINI5 4K旗舰行车记录仪正式发布 本次新品不仅在影像上实现再一次突破 在传输 存储及远程互联等功能上 也有更多创新升级 同时 盯盯拍MINI5作为畅连通话及AR导航视觉终端 也在最新的荣耀智慧生活新品发布会
  • 相机姿态估计

    目录 一 相机姿态估计原理 二 相机姿态估计实现 一 相机姿态估计原理 首先介绍一下什么是世界坐标系和相机坐标系 世界坐标系是自己定义的一个坐标系 这里我定义世界坐标系是X轴垂直屏幕指向人 Y轴水平向右 Z轴竖直向上 相机坐标系有统一的规定
  • 用matlab绘制幂函数

    用matlab绘制幂函数 下周轮到我做论文汇报了 刚好前两天看了网格水印的文章 就决定汇报前两天看到的那篇论文了 在准备ppt的过程中 绘制了一些幂函数 感觉matlab真的是很强大啊 可以绘制各种曲线 下面就简要介绍一下如何用matlab
  • Python错误笔记:NameError: name 'M' is not defined

    1 在使用name input 时报 NameError name M is not defined的错误 解决方式 使用raw input 代替input 资料 https blog csdn net dq dm article deta
  • iOS protobuf3.1.0使用

    Protobuf简介 Protocol Buffer是google 的一种数据交换的格式 已经在Github开源 目前最新版本是3 1 0 它独立于语言 独立于平台 google 提供了多种语言的实现 Java C C Go 和 Pytho
  • java ResultSet获得总行数

    在Java中 获得ResultSet的总行数的方法有以下几种 第一种 利用ResultSet的getRow方法来获得ResultSet的总行数 Statement stmt con createStatement ResultSet TYP
  • 扩散模型实战(一):基本原理介绍

    扩散模型 Diffusion Model 是 类 分先进的基于物理热 学中的扩散思想的深度学习 成模型 主要包括前向扩散和反向扩散两个过程 成模型除了扩散模型之外 还有出现较早的VAE Variational Auto Encoder 变分
  • pandas入门:导出数据的四种方式

    pandas导出数据到文件的四种方式 import pandas as pd import pymysql df pd DataFrame A 3 4 8 9 B 1 2 2 4 4 5 7 3 C aa bb cc dd def expo
  • MATLAB经典代码实现---LASSO和Elastic net

    作为正则化约束或者变量稀疏筛选相关领域的经典分析方法 最小绝对收缩和选择方法 Least Absolute Shrinkage and Selection Operator LASSO 和弹性网络 Elastic net 已被广泛应用到各行
  • 文件上传漏洞进阶教程/白名单绕过/图片马制作/图片马执行

    一 白名单绕过 相对于前面的黑名单绕过 白名单更加难以绕过 使用白名单验证相对比较安全 但如果存在可控参数目录 也存在被绕过的风险 目录可控 00截断绕过上传 upload lab pass11 源码分析 is upload false m
  • Java多线程(附代码示例)

    1 一些概念 线程就是独立的执行路径 在程序运行时 即使没有自己创建线程 后台也会有多个线程 如主线程 gc线程 main 称之为主线程 是系统的入口 用于执行整个程序 在一个进程中 如果开辟了多个线程 线程的运行由调度器安排调度 调度器是
  • 数据处理时如何解决噪声数据?

    一 什么是噪声 在机器学习中我们在独立随机抽样的时候会出现一些搞错的信息 这些错误的数据我们称之为杂讯 或者噪音 noise 一般可以归结为一下两种 以二分为例 输出错误 1 同样的一笔数据会出现两种不同的评判 2 在同样的评判下会有不同的
  • WINXP优化详解

    WinXP的启动会有许多影响速度的功能 尽管ms说已经作最优化处理过 但对我们来说还是有许多可定制之处 我一般是这样来做的 1 修改注册表的run键 取消那几个不常用的东西 比如Windows Messenger 启用注册表管理器 开始 运
  • 问题解决:windows未能启动,原因可能是最近更改了硬件或软件

    开机出现如下画面 电脑原先是win7旗舰版 没用几天 不知道怎么出现了这样的问题 网上查了很多 也用了几种方法 有些方法不知道是不是不行 总之没有解决我这里的问题 最终我用下面的方法解决了这个问题 解决方法 以下是重装系统的过程 1 首先制
  • For与while时间的对比

    本文首发于cartoon的博客 转载请注明出处 https cartoonyu github io cartoon blog post java for E4 B8 8Ewhile E6 97 B6 E9 97 B4 E7 9A 84 E5
  • Mac OS X 文件夹本地化方法(汉化)

    为避免中文编码问题 建议以后无论是操作系统语言还是文件夹 文件语言还有软件语言 一律用英文来代替 经常看到 OS X 中的一些文件夹名称会随系统语言的更改而自动改变 有时候你想要某个英文的文件夹名称显示成对应的中文 但是又不想改文件夹名 可
  • C++中IO类的基本解析

    文件输入输出 缓冲区 上图展示了C 中文件IO设计类的基本关系 从中我们可以看出 标准输入与文件输入类继承于同一个基类 标准输出与文件输出类继承于同一个基类 下面针对C 中IO类的一些特性进行介绍 c 的输入与输出包括以下三个部分 对系统制