C++之I/0流操作(标准流、文件流、二进制操作等)

2023-10-29

流(stream)为C++的输入输出操作提供了许多的便利,通常我们使用的流是std::out用于输出,使用std::cin用于接收用户的输入,除此之外,C++还提供了文件流用于实现文件的读写操作,字符串流用于进行字符串的操作。

标准输入输出

头文件:#include<iostream>
返回值:是流对象,可以当bool类型使用
函数:按行读取 getline(流对象, string对象

//标准输入输出
#include <iostream>
#include <string>
using namespace std;
int main()
 
    string str;
    cin >> str;//按空格换行符tab键分割
    cout << str << endl;
    while (getline(cin, str))//返回值为流对象,可以当作bool类型使用
    {
        if (0 == str.compare("quit"))//或者"quit" == str
        {
            break;
        }
        cout << str << endl;
    }
    cout << "退出成功!" << endl;
    return 0;
}


文本文件输入输出

头文件:#include<fstream>

文件类型

• 文本文件:文件以文本中的ASCII码形式存储在计算机中
• 二进制文件:文件以文本中的二进制形式存储在计算机中,用户一般不能直接读懂

文件打开方式

打开方式 解释
ios::in 为读文件而打开文件
ios::out 为写文件而打开文件
ios::ate 初始位置:文件尾
ios::app 追加方式写文件
ios::trunc 如果文件存在先删除,再创建
ios::binary 二进制方式

注意:文件打开方式可以配合使用,利用|操作符
例如:用二进制写文件 ios::binary | ios::out

写文件

写文件步骤:
方法一:

  1. 头文件 #include
  2. 创建流对象 ofstream ofs;
  3. 打开文件 ofs.open(“文件路径”,打开方式);
  4. 打开文件并判断文件是否正确打开 ifs.open(“文件路径”,打开方式);
  5. 写数据 ofs<<“写入的数据”;
  6. 关闭文件 ofs.close();

方法二:创建流对象并打开文件:ofstream ofs(“文件路径”, 打开方式);

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    ofstream ofs;
    ofs.open("1.txt", ios::out);//以文本写模式打开或者创建文件
    //方式二  ofstream ofs("1.txt", ios::out);创建流对象并且打开文件
    
    if (!ofs.is_open())//判断是否打开成功 true-成功 false-失败
    {
        cout << "创建或者打开文件失败" << endl;
    }
    ofs << "写入数据" << endl;
    ofs.close();
    return 0;
}


在这里插入图片描述

读文件

读文件步骤:

  1. 头文件 #include
  2. 创建流对象 ifstream ifs;
  3. 打开文件 ifs.open(“文件路径”,打开方式);
  4. 判断文件是否正确打开 ifs.open(“文件路径”,打开方式);
  5. 读数据 四种方式读取
  6. 关闭文件 ofs.close();
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int main()
{
    ifstream ifs;
    ifs.open("1.txt", ios::in);//以文本读方式打开文件
    if (!ifs.is_open())
    {
        cout << "打开文件失败" << endl;
    }
 
    //方法一
    string buffer;
    while (ifs >> buffer) //读的数据以空格换行符tab分隔
    {
        cout << buffer << endl;
    }
 
 
    //方法二
    while (getline(ifs, buffer))//以行的形式读取
    {
        cout << buffer << endl;
    }
    
    //方法三
    char c;
    while ((c = ifs.get()) != EOF)//一次读取一个字符,读到EOF停止
    {
        cout << c;
    }
 
    //方法四
    char b3[100] = { 0 };
    while (ifs.getline(b3, 100)) //一次读取100个字节
    {
        cout << b3 << endl;
    }
    ifs.close();//关闭文件
    return 0;
}

二进制文本输入输出

写文件

二进制写文件主要利用流对象成员函数write
函数原型:ostream& write(const char * buffer, int len);
第一个参数:字符指针buffer指向内存中的一段空间
第二个参数:读写的字节数
在这里插入图片描述

读文件

二进制读文件主要利用流对象成员函数read
函数原型:istream& read(char * buffer, int len);
第一个参数:字符指针buffer指向内存中的一段空间
第二个参数:读写的字节数
在这里插入图片描述

字符串输入输出

头文件:#include<sstream>

往流里面输出

#include <sstream>
#include <iostream>
using namespace std;
int main()
{
    ostringstream s;
    s << 10;
    cout << s.str() << endl;//无参 打印
    s.str("");//给空字符串   清空
    s << 5.9;
    cout << s.str() << endl;
    return 0;
}

从流里面读出

int main()
{
    //如果这个字符串严格按照空格(空白字符)分隔就可以获取
    istringstream stream("10 20 nihao");
    int a;
    int b;
    string str;
    stream >> a >> b >> str;
    cout << a << "\t" << b << "\t" << str << endl;
    return 0;
}


格式控制

头文件:#include
可直接查表

#include <iomanip>//格式控制头文件
int main()
{
    cout << setiosflags(ios::right) << setw(7) << 1 << endl;//设置宽度为7,右对齐
    cout << resetiosflags(ios::right);//取消对齐方式
    cout << setfill('.') << setw(30) << endl;//宽度设置为30,填充'.'输出
    cout << setfill(' ');//恢复填充为空格
    cout << setiosflags(ios::showpos) << 1 << endl;//强制在正数前加+
    cout << resetiosflags(ios::showpos);//取消强制正数前加+
    cout << setiosflags(ios::showpoint) << 1.2 << endl;//强制显示小数点后的无效0
    cout << resetiosflags(ios::showpoint);//取消强制显示小数点后的无效0
    cout << setiosflags(ios::scientific);//科学计数法
    cout << resetiosflags(ios::scientific);//取消科学记数法
    cout << setprecision(18);//精度为18,正常为16
    cout << setprecision(6);//恢复为6
 
    cout << oct << 15;//输出为八进制数
    cout << hex << 20;//输出为十六进制数
    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++之I/0流操作(标准流、文件流、二进制操作等) 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • STL 迭代器:前缀增量更快? [复制]

    这个问题在这里已经有答案了 可能的重复 C 中的预增量比后增量快 正确吗 如果是 为什么呢 https stackoverflow com questions 2020184 preincrement faster than postinc
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 如何从本机 C(++) DLL 调用 .NET (C#) 代码?

    我有一个 C app exe 和一个 C my dll my dll NET 项目链接到本机 C DLL mynat dll 外部 C DLL 接口 并且从 C 调用 C DLL 可以正常工作 通过使用 DllImport mynat dl
  • Python 中的二进制缓冲区

    在Python中你可以使用StringIO https docs python org library struct html用于字符数据的类似文件的缓冲区 内存映射文件 https docs python org library mmap
  • 对类 static constexpr 结构的未定义引用,g++ 与 clang

    这是我的代码 a cp p struct int2 int x y struct Foo static constexpr int bar1 1 static constexpr int2 bar2 1 2 int foo1 return
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • ASP.NET Core 3.1登录后如何获取用户信息

    我试图在登录 ASP NET Core 3 1 后获取用户信息 如姓名 电子邮件 id 等信息 这是我在登录操作中的代码 var claims new List
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile

随机推荐

  • Mac下安装rocketMQ

    一 前提是电脑上已经安装了JDK 没有安装的参照 https jingyan baidu com article 908080221f3cfefd91c80fbf html 二 RocketMQ的下载与安装 下载 官网地址 http roc
  • 利用windows服务器自带的IIS搭建网站并发布公网访问【内网穿透】

    文章目录 1 前言 2 Windows网页设置 2 1 Windows IIS功能设置 2 2 IIS网页访问测试 3 Cpolar内网穿透 3 1 下载安装Cpolar 3 2 Cpolar云端设置 3 3 Cpolar本地设置 4 公网
  • Ocaml 对偶、元组

    1 对偶 元组 Ocaml语言中 构造乘积类型的操作符是 类型A和类型B的乘积类型记 A B 构造乘积类型的元素的操作符是逗号 如果a属于类型A b属于类型B 那么 a b 属于类型A B 二元乘积类型的元素称为对偶 多元乘积类型中的元素称
  • 浅谈C++函数重载

    C 相较于C语言来说 重载是一重大特性 让我们一起简单的回顾一下重载那些事 传送门 函数重载是什么 为什么有函数重载 函数重载是如何实现的 总结 函数重载是什么 函数重载 是函数的一种特殊情况 C 允许在同一作用域中声明几个功能相似的同名函
  • uniapp中图片宽度100%,高度自适应

    uniapp中图片宽度100 高度自适应
  • EditText限制只能输入汉字字母和空格

    这是第一次使用正则表达式来实现输入框限制输入类型 场景是项目中个人信息模块中的姓名字段只能要求输入这些类型 之前只是用其他的方式实现过其他类型的限制输入 这次想到这个方法边让同事帮忙写了个正则 对于正则我可真是心有余而力不足 希望能够帮到大
  • Ajax简介

    目录 Ajax简介 Ajax特点 基础语法 数据编码格式 form表单中 Ajax中 ajax携带数据 回调函数 序列化 响应状态码 Ajax简介 AJAX 全称Asynchronous JavaScript And XML 即异步JS和X
  • react hooks组件间的传值方式(使用ts),子孙传值给祖先组件

    父子组件传值 参考 react hooks组件传值 父传子很简单 只要父组件传参 子组件写好interface childProps和props去接收即可 子传父稍复杂 父组件写一个回调函数 changeTaskState id any g
  • AIGC,驱动架构与业务的新动力

    本期CCF TF第117期 AIGC 驱动架构与业务的新动力 活动由CCF TF架构SIG承办 新浪协办 邀请到了科大讯飞 阿里云 去哪儿网 新浪微博等多位互联网技术专家 共同分享交流如何通过应用AIGC技术 驱动架构和业务高效发展 为工程
  • 【满分】【华为OD机试真题2023 JS】数字加减游戏

    华为OD机试真题 2023年度机试题库全覆盖 刷题指南点这里 数字加减游戏 知识点广搜 时间限制 1s 空间限制 256MB 限定语言 不限 题目描述 小明在玩一个数字加减游戏 只使用加法或者减法 将一个数字s变成数字t 每个回合 小明可以
  • 修复VMware网络连接失败及设置固定IP

    最近被这个网络折磨疯了 记录一下怎么修复虚拟机网路连接 VM软件安装好后 就有10个网络连接类型可供选择 分别是 VMnet0 VMnet1 VMnet2 VMnet3 VMnet4 VMnet5 VMnet6 VMnet7 VMnet8
  • 数据库操作:汇总数据(聚集函数)

    我们经常需要汇总数据而不用把它们实际检索出来 为此MySQL提供了专门的函数 聚集函数运行在行组上 计算和返回单个值的函数 SQL聚集函数 1 AVG 返回某列的平均值 2 COUNT 返回某列的行数 3 MAX 返回某列的最大值 4 MI
  • java数组及数组函数

    数组求和 1 System out println 1 2 3 4 5 getSum 1 2 3 4 5 5个参数 public static int getSum int numbers 可变长形参 本质为数组 int sum 0 for
  • 服务器系统要用GUID还是MBR,分享win10分区格式MBR和GUID有什么区别 教你区分MBR和GUID格式...

    今天IT天空小编要给大家分享下最新的教程 电脑装win10系统需要选择正确的分区格式 这样电脑才能保持正常运转 如果格式安装错误 电脑就没办法继续运行了 一般情况下 win10分区格式MBR和GUID两种选择 那么这两者有何区别 电脑小白肯
  • 华为ensp,实战案例一一使用模拟器构建局域网络

    1 案例目标 I 通过组网设计 掌握小型网络的组建 路由的设计 对小型网络系统进行分析 提出建网解决方案 2 综合运用路由 VLAN的相关技术 3 综合运用VLAN创建 Access和Trunk接口配置 VLAN间路由配置 DHCP 也址池
  • 民族代码设计

    民族代码和对应民族名称 在开发时 设计民族的数据字典 民族代码 民族名称 01 汉族 01 汉族 02 蒙古族 03 回族 04 藏族 05 维吾尔族 06 苗族 07 彝族 08 壮族 09 布依族 10 朝鲜族 11 满族 12 侗族
  • 基于遗传算法的BP神经网络优化算法(matlab实现)

    1 理论基础 1 1 BP神经网络概述 BP网络是一类多层的前馈神经网络 它的名字源于在网络训练的过程中 调整网络的权值的算法是误差的反向传播的学习算法 即为BP学习算法 BP算法是Rumelhart等人在1986年提出来的 由于它的结构简
  • Scanner 类

    目录 1 什么是Scanner类 2 创建Scanner类的基本语法 3 使用next方法 4 使用nextLine方法 5 next 与nextLine 6 数据类型的接收方式 7 Scanner类知识扩展 8 今日箴言 1 什么是Sca
  • JAVA代码规范

    一 MyBatis 不要为了多个查询条件而写 1 1 二 迭代entrySet 获取Map 的key 和value 三 使用Collection isEmpty 检测空 四 初始化集合时尽量指定其大小 五 若需频繁调用Collection
  • C++之I/0流操作(标准流、文件流、二进制操作等)

    目录 标准输入输出 文本文件输入输出 文件类型 文件打开方式 写文件 读文件 二进制文本输入输出 写文件 读文件 字符串输入输出 往流里面输出 从流里面读出 格式控制 流 stream 为C 的输入输出操作提供了许多的便利 通常我们使用的流