C++11QT复习 (三)

文章目录

    • @[toc]
    • Day5-2 文件IO(2025.03.24)
      • 1. 缓冲区与刷新
        • 1.1 常见的缓冲刷新方式
      • 2. 文件读写操作
        • 2.1 读取文件
        • 2.2 写入文件
        • 2.3 追加模式写入
        • 2.3 完整代码
      • 3. 文件定位操作
      • 4. 字符串IO
      • 5. 配置文件解析示例
      • 6. 完整代码
      • 7. 二进制文件操作
      • 总结

Day5-2 文件IO(2025.03.24)

1. 缓冲区与刷新

在C++的标准输入输出流 (iostream) 中,I/O 操作通常会涉及缓冲区,以提高效率。默认情况下,cout 采用缓冲模式,输出内容会暂存到缓冲区,只有在缓冲区满了或遇到某些特殊情况(如换行)时,数据才会被刷新到屏幕。

1.1 常见的缓冲刷新方式
方法作用例子
cout << endl;输出换行并刷新缓冲区cout << "Hello" << endl;
cout << flush;只刷新缓冲区,但不换行cout << "Hello" << flush;
cout << ends;在缓冲区加入一个空字符(\0),但不会刷新cout << "Hello" << ends;
#include <iostream>
#include <thread>
#include <chrono>using namespace std;void test()
{for (size_t i = 0; i < 1024; i++){cout << "a";}cout << 'b' << endl; // 刷新缓冲区并换行cout << "c" << flush; // 只刷新,不换行cout << "d" << ends;  // 只插入空字符,不刷新this_thread::sleep_for(chrono::seconds(5));
}int main()
{test();return 0;
}

2. 文件读写操作

C++标准库提供了 <fstream> 头文件,其中包含三个主要的文件流类:

类名作用
ifstream读文件(input file stream)
ofstream写文件(output file stream)
fstream读写文件(file stream)
2.1 读取文件
#include <iostream>
#include <fstream>
#include <string>using namespace std;void readFile()
{ifstream ifs("test.txt"); // 打开文件if (!ifs.is_open()){cerr << "文件打开失败" << endl;return;}string line;while (getline(ifs, line)){cout << line << endl;}ifs.close(); // 关闭文件
}int main()
{readFile();return 0;
}
2.2 写入文件
void writeFile()
{ofstream ofs("output.txt");if (!ofs){cerr << "文件打开失败" << endl;return;}ofs << "Hello, world!" << endl;ofs.close();
}
2.3 追加模式写入

使用 ios::app 选项可以在文件末尾追加内容,而不会覆盖原有数据。

void appendToFile()
{ofstream ofs("log.txt", ios::app);if (!ofs){cerr << "文件打开失败" << endl;return;}ofs << "新日志记录" << endl;ofs.close();
}
2.3 完整代码
#include <iostream>
#include <fstream>
#include <string>
#include <vector>using namespace std;void test()
{ifstream ifs("test.txt");if (!ifs.good()){cout << "文件打开失败" << endl;return;}//文件流读文件//对于文件输入流而言,默认以空格作为分隔符string line;while (ifs >> line)//cin >> line{cout << line << endl;}
}void test2()
{ifstream ifs("test.txt");if (!ifs.good()){cout << "文件打开失败" << endl;return;}//文件流读文件//对于文件输入流而言,默认以空格作为分隔符string line;while (getline(ifs,line)){cout << line << endl;}
}//打印前几行的内容
void test3()
{ifstream ifs("test.txt");if (!ifs.good()){cout << "文件打开失败" << endl;return;}//文件流读文件//对于文件输入流而言,默认以空格作为分隔符string line;int lineNum = 0;while (getline(ifs, line)){cout << line << endl;lineNum++;if (lineNum == 5){break;}}
}//打印指定行的内容
void test4()
{string fileName = "test.txt";ifstream ifs(fileName);if (!ifs.good()){cout << "文件打开失败" << endl;return;}//文件流读文件//对于文件输入流而言,默认以空格作为分隔符string line[120];size_t lineNum = 0;vector<string> vec;while (getline(ifs, line[lineNum])){++lineNum;}cout << "line[22] = " << line[22] << endl;
}void test5()
{string fileName = "test.txt";ifstream ifs(fileName);if (!ifs.good()){cout << "文件打开失败" << endl;return;}//文件流读文件//对于文件输入流而言,默认以空格作为分隔符string line;vector<string> vec;while (getline(ifs, line)){vec.push_back(line);}cout << "vec[22] = " << vec[22] << endl;
}void test6()
{ifstream ifs("test.txt");if (!ifs.good()){cerr << "ifstream is not good!" << endl;return;}ofstream ofs("wd.txt");if (!ofs.good()){cerr << "ofstream is not good!" << endl;ifs.close();//在程序异常退出时,关闭前面的ifsreturn;}string line;while (getline(ifs, line)){ofs << line << endl;}ifs.close();ofs.close();
}void test7()
{//对于文件的输出输出流而言,当文件不存在的时候就打开失败fstream fs("wenchang.txt");if (!fs.good()){cerr << "fstream is not good!" << endl;return;}//业务逻辑//通过键盘输入数据,使用fs进行读文件,随后输出到屏幕int number = 0;cout << "请输入5次数字: " << endl;for (size_t idx = 0; idx != 5; ++idx){cin >> number;fs << number << " ";}size_t len = fs.tellp();cout << "len= " << len << endl;fs.seekp(0);len = fs.tellp();cout << "len= " << len << endl;for (size_t idx = 0; idx != 5; ++idx){cout << "fs.failbit = " << fs.fail() << endl<< "fs.eofbit = " << fs.eof() << endl<< "fs.goodbit = " << fs.good() << endl;fs >> number;cout << number << " ";}cout << endl;fs.close();
}//追加模式
void test8()
{ifstream ifs("test.txt", std::ios::in | std::ios::ate);if (!ifs.good()){cerr << "ifstream is not good!" << endl;return;}cout << "ifs.tellg() = " << ifs.tellg() << endl;ifs.close();
}void test9()
{ofstream ofs("wenchang.txt",std::ios::out | std::ios::app);if (!ofs.good()){cerr << "ofstream is not good!" << endl;return;}cout << "ofs.tellg() = " << ofs.tellp() << endl;ofs.close();
}int main(int argc, char* argv[])
{	//test();//test5(); //读取文件内容到vector容器中test9();return 0;
}

3. 文件定位操作

文件流支持 seekg()(get)和 seekp()(put)来定位文件指针。

void filePositioning()
{fstream fs("test.txt", ios::in | ios::out);if (!fs){cerr << "文件打开失败" << endl;return;}fs.seekg(0, ios::end); // 移动到文件末尾cout << "文件大小: " << fs.tellg() << " 字节" << endl;fs.close();
}

4. 字符串IO

C++ 提供了 stringstream 以便在字符串中进行 I/O 操作。

#include <sstream>void stringStreamDemo()
{stringstream ss;int num = 42;ss << "数字: " << num;string output = ss.str();cout << output << endl;
}

5. 配置文件解析示例

void readConfig(const string& filename)
{ifstream ifs(filename);if (!ifs){cerr << "打开文件失败: " << filename << endl;return;}string line;while (getline(ifs, line)){istringstream iss(line);string key, value;iss >> key >> value;cout << key << " -> " << value << endl;}ifs.close();
}

6. 完整代码

#include <iostream>
#include <sstream>
#include <fstream> // 添加此行以包含 ifstream 的定义using namespace std;
using std::ostringstream;
using std::istringstream;
using std::stringstream;string int2string(int value)
{ostringstream oss;//中转oss << value;return oss.str();//获取底层的字符串
}void  test()
{int number = 10;string s1 = int2string(number);cout << "s1 = " << s1 << endl;
}void test2()
{int number1 = 10;int number2 = 20;stringstream ss;ss << "number1 = " << number1<< "number2 = " << number2;string s1 = ss.str();cout << "s1 =" <<  s1 << endl;string key;string value;while (ss >> key >> value){cout << key << "--->" << value << endl;}}void readConfig(const string& filename)
{ifstream ifs(filename);if (!ifs){cerr << "open" << filename << "error!" << endl;return;}string line;while (getline(ifs, line)){istringstream iss(line);string key, value;iss >> key >> value;cout << key << "  " << value << endl;}ifs.close();
}void test3()
{readConfig("my.conf");
}int main()
{test3();return 0;
}

7. 二进制文件操作

#include <iostream>
#include <fstream>
using namespace std;struct Data {int id;double value;
};// 写入二进制文件
void writeBinaryFile(const string &filename)
{ofstream ofs(filename, ios::binary);if (!ofs){cerr << "文件打开失败!" << endl;return;}Data d = {1, 3.14};ofs.write(reinterpret_cast<const char *>(&d), sizeof(d));ofs.close();
}// 读取二进制文件
void readBinaryFile(const string &filename)
{ifstream ifs(filename, ios::binary);if (!ifs){cerr << "文件打开失败!" << endl;return;}Data d;ifs.read(reinterpret_cast<char *>(&d), sizeof(d));cout << "id: " << d.id << ", value: " << d.value << endl;ifs.close();
}int main()
{string filename = "data.bin";writeBinaryFile(filename);readBinaryFile(filename);return 0;
}

总结

  1. 文本文件
    • ifstream 读取文件,ofstream 写入文件,fstream 读写文件。
    • seekg()seekp() 控制文件指针。
    • stringstream 适用于字符串的 I/O 操作。
    • ios::app 可用于追加模式写入文件。
  2. 二进制文件
    • 读写方式:ifstreamofstream 需使用 ios::binary 模式
    • 读取方式:read()write()
    • 适用于存储结构化数据,如 struct 类型的存储和读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74388.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis Sentinel 详解

Redis Sentinel 详解 1. 什么是 Redis Sentinel&#xff1f;有什么用&#xff1f; Redis Sentinel&#xff08;哨兵&#xff09; 是 Redis 官方提供的高可用性解决方案&#xff0c;主要用于监控、通知和自动故障转移。当 Redis 主节点&#xff08;master&#xff09;发生故障…

AI日报 - 2025年3月25日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Nebula&#xff08;Google Gemini 2.0 Pro&#xff09;破解复杂数学谜题 编码与推理能力再上新台阶 ▎&#x1f4bc; 商业动向 | Sesame AI开源10亿参数语音模型CSM-1B 语音AI进入普惠时代 …

AI医疗革命:英伟达GTC 2025医疗健康与生命科学会议全分析

AI医疗革命:英伟达GTC 2025医疗健康与生命科学会议全分析 一、GTC 2025:AI 医疗的算力与生态双突破 1.1 黄仁勋演讲核心:从训练到推理的代际跨越 在科技界瞩目的英伟达 GTC 2025 大会上,英伟达 CEO 黄仁勋的主题演讲成为全场焦点,为 AI 医疗领域带来了极具变革性的消息。…

【机器学习/大模型/八股文 面经 (一)】

1. PPO算法中使用GAE的好处以及参数γ和λ的作用是什么? 参考答案: GAE(Generalized Advantage Estimation) 的优势在于通过指数加权多步TD误差,平衡优势估计的偏差与方差,提升策略优化的稳定性。γ(折扣因子):控制未来奖励的衰减程度,值越大表示更关注长期收益。λ…

03 Python 基础:数据类型、运算符与流程控制解析

文章目录 一、数据类型 内置的六大类数字类型整数类型 int浮点数 float布尔 bool字符串 str 变量命名 二、数字类型的相互转换显式类型的转换整数&#xff0c;浮点数&#xff0c;复数 之间的显式转换 隐式类型的转换 三、标识符算术运算符比较运算符逻辑运算符位运算符赋值运算…

视频知识库初步设想

将视频字幕提取出来作为知识库来源定位,下一步设想:把视频上的图片信息也精简出来作为定位。 下面是测试例子: 入参: {"model":"deepseek-ai/DeepSeek-R1-Distill-Llama-8B","messages":[{"role":"system","cont…

数据库原理13

1.关系模式设计不当引起的问题&#xff1a;数据冗余&#xff1b;更新异常&#xff1b;插入异常&#xff1b;删除异常 2.外码可以是单个属性&#xff0c;也可以是属性组 3.动态SQL是SQL标准提供的一种语句运行机制 4.若一个模式分解保持函数依赖&#xff0c;则该分解一定具有…

初级:异常处理面试题深度解析

一、引言 在Java开发中&#xff0c;异常处理是确保程序健壮性和稳定性的重要机制。面试官通过相关问题考察候选人对异常处理的理解和运用能力&#xff0c;以及在实际开发中处理异常的经验。本文将深入剖析常见的异常处理面试题&#xff0c;结合实际开发场景&#xff0c;帮助读…

Apache Spark - 用于大规模数据分析的统一引擎

Apache Spark - 用于大规模数据分析的统一引擎 下载运行示例和 Shell使用 Spark Connect 在 Anywhere 上运行 Spark 客户端应用程序 在集群上启动从这里去哪里使用 Spark Shell 进行交互式分析基本有关数据集作的更多信息缓存 自包含应用程序从这里去哪里 Apache Spark 是用于大…

餐饮管理系统的设计与实现(代码+数据库+LW)

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#…

【C#】Winform调用NModbus实现Modbus TCP 主站通讯

一、前言 Modbus是一种串行通信协议&#xff0c;是工业领域全球最流行的协议之一。 1.1 环境 系统&#xff1a;Win11 工具&#xff1a;Visual Studio 2022 .Net 版本&#xff1a;.Net Framework4.6.0 依赖库&#xff1a;NModbus 3.0.81 1.2 协议类型 Modbus RTU&#xff1a;一…

【leetcode题解】贪心算法

目录 贪心算法 柠檬水找零 将数组和减半的最少操作次数 最大数 摆动序列 最长递增子序列 递增的三元子序列 最长连续递增序列 买卖股票的最佳时机 买卖股票的最佳时机 II K 次取反后最大化的数组和 按身高排序 优势洗牌 最长回文串 增减字符串匹配 分发饼干 最…

Langchain4J框架相关面试题

以下是关于Langchain4J框架的面试题目及答案 ### Langchain4J基础概念类 1. **Langchain4J框架是什么&#xff1f;它的核心功能有哪些&#xff1f;** Langchain4J是一个用于构建语言模型应用的Java框架&#xff0c;它为开发者提供了一套简洁高效的API&#xff0c;使得在Jav…

Apache Doris

Apache Doris介绍 Apache Doris 是一个基于 MPP 架构的高性能、实时的分析型数据库&#xff0c;以极速易用的特点被人们所熟知&#xff0c;仅需亚秒级响应时间即可返回海量数据下的查询结果&#xff0c;不仅可以支持高并发的点查询场景&#xff0c;也能支持高吞吐的复杂分析场…

VLAN间通信

目录 第一步&#xff1a;配vlan 第二步&#xff1a;配置核心vlanif,MAC地址信息。 第三步&#xff1a;ospf协议 三层交换机&#xff08;汇聚层&#xff09;: 对于交换机、路由器、防火墙等网络设备而言&#xff0c;接口类型一般存在两种&#xff1a;二层接口&#xff0c;三…

LeetCode热题100精讲——Top2:字母异位词分组【哈希】

你好&#xff0c;我是安然无虞。 文章目录 题目背景字母异位词分组C解法Python解法 题目背景 如果大家对于 哈希 类型的概念并不熟悉, 可以先看我之前为此专门写的算法详解: 蓝桥杯算法竞赛系列第九章巧解哈希题&#xff0c;用这3种数据类型足矣 字母异位词分组 题目链接&am…

基于python+django的图书借阅网站-图书借阅管理系统源码+运行步骤

该系统是基于pythondjango开发的在线图书借阅管理系统。系统适合场景&#xff1a;大学生、课程作业、系统设计、毕业设计。 演示地址 前台地址&#xff1a; http://book.gitapp.cn 后台地址&#xff1a;http://book.gitapp.cn/#/admin 后台管理帐号&#xff1a; 用户名&…

uni-app集成保利威直播、点播SDK经验FQ(二)|小程序直播/APP直播开发适用

通过uniapp集成保利威直播、点播SDK来开发小程序/APP的视频直播能力&#xff0c;在实际开发中可能会遇到的疑问和解决方案&#xff0c;下篇。更多疑问请咨询19924784795。 1.ios不能后台挂起uniapp插件 ios端使用后台音频播放和画中画功能&#xff0c;没有在 manifest.json 进…

数据库三级填空+应用题(1)

填空 35【答案】TOP 3 WITH TIES 【解析】希望选出商品数量最多的前3类商品&#xff0c;并获得相应的商品类别和数量。with ties一般是和Top 、 order by相结合使用,表示包括与最后一行order by后面的参数取值并列的结果。 36在SQL Server 2008中&#xff0c;每个数据页可存储8…

前端(vue)学习笔记(CLASS 5):自定义指令插槽路由

1、自定义指令 内置指令&#xff1a;内部提供的&#xff0c;每个指令都有自己各自独立的功能 自定义指令&#xff1a;自己定义的指令&#xff0c;可以封装一些dom操作&#xff0c;扩展额外功能 全局注册-语法 例如&#xff0c;当页面加载时&#xff0c;让元素获得焦点 Vue.…