当前位置: 首页 > news >正文

C++IO流

C++IO流

IO: 向设备输入数据和输出数据

C++的IO流设备: 文件、控制台、特定的数据类型(stringstream)

c++中,必须通过特定的已经定义好的类, 来处理IO(输入输出)

读写文件:文件流

文件流: 对文件进行读写操作

头文件:  <fstream>

类库: ifstream 对文件输入(读文件)、ofstream 对文件输出(写文件)、fstream  对文件输入或输出

对文本文件流读写

文件打开方式:

模式标志

描述

ios::in

读方式打开文件

ios:out

写方式打开文件

ios::trunc

如果此文件已经存在, 就会打开文件之前把文件长度截断为0

ios::app

尾部最加方式(在尾部写入)

ios::ate

文件打开后, 定位到文件尾                                              

ios::binary

二进制方式(默认是文本方式)

以上打开方式, 可以使用位操作 |  组合起来

写文本文件

#include <fstream>

#include <iostream>

#include <string>

using namespace std;

int main()

{

string name;

int age;

ofstream outfile;  //也可以使用fstream, 但是fstream的默认打开方式不截断文件长度

// ofstream的默认打开方式是,  截断式写入 ios::out |  ios::trunc

// fstream的默认打开方式是,  截断式写入   ios::out

// 建议指定打开方式

outfile.open("user.txt", ios::out | ios::trunc);

while (1) {

cout << "请输入姓名: [ctrl+z退出] ";

cin >> name;

if (cin.eof()) { //判断文件是否结束

break;

}

outfile << name << "\t";

cout << "请输入年龄: ";

cin >> age;  

outfile << age << endl;  //文本文件写入

}

// 关闭打开的文件

outfile.close();

system("pause");

return 0;

}

读文本文件

#include <fstream>

#include <iostream>

#include <string>

using namespace std;

int main()

{

string name;

int age;

ifstream infile;

infile.open("user.txt");

while (1) {

infile >> name;

if (infile.eof()) { //判断文件是否结束

break;

}

cout << name << "\t";

infile >> age;

cout << age << endl;  

}

// 关闭打开的文件

infile.close();

system("pause");

return 0;

}

对二进制文件流读写

思考:文本文件和二进制文件的区别?

文本文件: 写数字1,  实际写入的是 ‘1’。二进制文件:写数字1, 实际写入的是  整数1(4个字节,最低字节是1, 高3个字节都是0),写字符‘R’实际输入的还是‘R’

写二进制文件

使用文件流对象的write方法写入二进制数据

Demo

#include <fstream>

#include <iostream>

#include <string>

using namespace std;

int main()

{

string name;

int age;

ofstream outfile;

outfile.open("user.dat", ios::out | ios::trunc | ios::binary);

while (1) {

cout << "请输入姓名: [ctrl+z退出] ";

cin >> name;

if (cin.eof()) { //判断文件是否结束

break;

}

outfile << name << "\t";

cout << "请输入年龄: ";

cin >> age;  

//outfile << age << endl;  //会自动转成文本方式写入

outfile.write((char*)&age, sizeof(age));

}

// 关闭打开的文件

outfile.close();

system("pause");

return 0;

}

读二进制文件

使用文件流对象的read方法.

#include <fstream>

#include <iostream>

#include <string>

using namespace std;

int main()

{

string name;

int age;

ifstream infile;

infile.open("user.dat", ios::in | ios::binary);

while (1) {

infile >> name;

if (infile.eof()) { //判断文件是否结束

break;

}

cout << name << "\t";

// 跳过中间的制表符

char tmp;

infile.read(&tmp, sizeof(tmp));

//infile >> age; //从文本文件中读取整数, 使用这个方式

infile.read((char*)&age, sizeof(age));

cout << age << endl;  //文本文件写入

}

// 关闭打开的文件

infile.close();

system("pause");

return 0;

}

对文件流按格式读写取数据

使用stringstream

按指定格式写文件

Demo

#include <fstream>

#include <iostream>

#include <string>

#include <sstream>

using namespace std;

int main()

{

string name;

int age;

ofstream outfile;

outfile.open("user.txt", ios::out | ios::trunc);

while (1) {

cout << "请输入姓名: [ctrl+z退出] ";

cin >> name;

if (cin.eof()) { //判断文件是否结束

break;

}

cout << "请输入年龄: ";

cin >> age;

stringstream s;

s << "name:" << name << "\t\tage:" << age << endl;

outfile << s.str();

}

// 关闭打开的文件

outfile.close();

system("pause");

return 0;

}

按指定格式读文件

没有优雅的C++解决方案, 使用C语言的sscanf

#include <fstream>

#include <iostream>

#include <string>

#include <sstream>

#include <Windows.h>

using namespace std;

int main(void)

{

char name[32];

int age;

string line;

ifstream infile;

infile.open("user.txt");

while (1) {

getline(infile, line);

if (infile.eof()) { //判断文件是否结束

break;

}

sscanf_s(line.c_str(), "姓名:%s 年龄:%d", name, sizeof(name),&age);

cout << "姓名:" << name << "\t\t年龄:" << age << endl;

}

infile.close();

system("pause");

return 0;

}

文件流的状态检查

s.is_open( )        文件流是否打开成功, 

s.eof( )  流s是否结束

s.fail( ) 流s的failbit或者badbit被置位时, 返回true

failbit: 出现非致命错误,可挽回, 一般是软件错误

badbit置位, 出现致命错误, 一般是硬件错误或系统底层错误, 不可挽回

s.bad( )  流s的badbit置位时, 返回true

s.good( )  流s处于有效状态时, 返回true

s.clear( ) 流s的所有状态都被复位

随机读写:文件流的定位

seekg

seekg( off_type offset,      //偏移量

ios::seekdir origin );  //起始位置

作用:设置输入流的位置

参数1: 偏移量

参数2: 相对位置

  beg   相对于开始位置

  cur   相对于当前位置

  end 相对于结束位置

demo

读取当前程序的最后50个字符

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int main(void) {

ifstream infile;

infile.open("定位.cpp");

if (!infile.is_open()) {

return 1;

}

infile.seekg(-50, infile.end);

while (!infile.eof()) {

string line;

getline(infile, line);

cout << line << endl;

}

infile.close();

system("pause");

return 0;

}

tellg

返回该输入流的当前位置(距离文件的起始位置的偏移量)

Demo

获取当前文件的长度

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int main(void) {

ifstream infile;

infile.open("定位.cpp");

if (!infile.is_open()) {

return 1;

}

// 先把文件指针移动到文件尾

infile.seekg(0, infile.end);

int len = infile.tellg();

cout << "len:" << len;

infile.close();

system("pause");

return 0;

}

seekp

设置该输出流的位置

先向新文件写入:“123456789”

然后再在第4个字符位置写入“ABC”

#include <iostream>

#include <fstream>

#include <string>

using namespace std;

int main(void) {

ofstream outfile;

outfile.open("test.txt");

if (!outfile.is_open()) {

return 1;

}

outfile << "123456789";

outfile.seekp(4, outfile.beg);

outfile << "ABC";

outfile.close();

system("pause");

return 0;

}

常见错误总结

文件没有关闭: close(),可能导致写文件失败

    http://www.xdnf.cn/news/81199.html

    相关文章:

  1. AI 数字短视频数字人源码开发:多维赋能短视频生态革新​
  2. 图像预处理-直方图均衡化
  3. 卷积神经网络迁移学习:原理与实践指南
  4. GSAP 动画引擎实战:打造丝滑动效交互组件库
  5. 在 40 亿整数中捕获“恰好出现两次”的数字
  6. Git管理
  7. 离散化区间和 java c++
  8. Springboot整合MyBatisplus和快速入门
  9. lspci的资料
  10. crewai与langchain分析某公司股票是否可购买
  11. prtobuf的原理
  12. 2.Spring MVC与WebFlux响应式编程
  13. UOS+N 卡 + CUDA 环境下 X86 架构 DeepSeek 基于 vLLM 部署与 Dify 平台搭建指南
  14. Nature Communications 面向形状可编程磁性软材料的数据驱动设计方法—基于随机设计探索与神经网络的协同优化框架
  15. 30分钟编写十大排序算法完成
  16. 施磊老师基于muduo网络库的集群聊天服务器(四)
  17. 含锡废水具有显著的回收价值
  18. kvm下的ceph主机启动io请求统计
  19. AOSP Android14 Launcher3——RecentsView最近任务数据加载
  20. Hive学习
  21. 【数字图像处理】立体视觉基础(1)
  22. 禁止ubuntu自动更新
  23. 基于nlohmann/json 实现 从C++对象转换成JSON数据格式
  24. c++内存池
  25. 调整IntelliJ IDEA中当前文件所在目录的显示位置
  26. 可吸收聚合物:医疗科技与绿色未来的交汇点
  27. 解决IntelliJ IDEA配置文件(application.properties)中文注释变成乱码的问题
  28. linux驱动---视频播放采集架构介绍
  29. 2025年数字媒体设计与文化交流国际会议 (DMACE 2025)
  30. 【Python进阶】VSCode Python开发完全指南:从环境配置到高效调试