【C++初阶学习】C++的IO流(2)

简介: 【C++初阶学习】C++的IO流(2)

五、C++文件IO流


C++根据文件内容的数据格式分为二进制文件文本文件


  • 采用文件流对象操作文件的一般步骤:


定义一个文件流对象

ifstream ifile(只输入用)

ofstream ofile(只输出用)

fstream iofile(既输入又输出用)


使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系


使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写


关闭文件


示例:


#include<iostream>
#include <fstream>
using namespace std;
// 使用文件IO流用文本及二进制方式演示读写配置文件
struct ServerInfo
{
  char _ip[32]; // ip
  int _port; // 端口
};
struct ConfigManager
{
public:
  ConfigManager(const char* configfile = "cfserver.config")
    :_configfile(configfile)
  {}
  void WriteBin(const ServerInfo& info)
  {
    // 这里注意使用二进制方式打开写
    ofstream ofs(_configfile, ifstream::out | ifstream::binary);
    ofs.write((const char*)&info, sizeof(ServerInfo));
    ofs.close();
  }
  void ReadBin(ServerInfo& info)
  {
    // 这里注意使用二进制方式打开读
    ifstream ifs(_configfile, ifstream::in | ifstream::binary);
    ifs.read((char*)&info, sizeof(ServerInfo));
    ifs.close();
  }
  void WriteText(const ServerInfo& info)
  {
    // 这里会发现IO流写整形比C语言那套就简单多了,
    // C 语言得先把整形itoa再写
    ofstream ofs(_configfile);
    ofs << info._ip << endl;
    ofs << info._port << endl;
    ofs.close();
  }
  void ReadText(ServerInfo& info)
  {
    // 这里会发现IO流读整形比C语言那套就简单多了,
    // C 语言得先读字符串,再atoi
    ifstream ifs(_configfile);
    ifs >> info._ip;
    ifs >> info._port;
    ifs.close();
  }
private:
  string _configfile; // 配置文件
};
int main()
{
  ConfigManager cfgMgr;
  ServerInfo wtinfo;
  ServerInfo rdinfo;
  strcpy(wtinfo._ip, "127.0.0.1");
  wtinfo._port = 80;
  // 二进制读写
  cfgMgr.WriteBin(wtinfo);
  cfgMgr.ReadBin(rdinfo);
  cout << rdinfo._ip << endl;
  cout << rdinfo._port << endl;
  // 文本读写
  cfgMgr.WriteText(wtinfo);
  cfgMgr.ReadText(rdinfo);
  cout << rdinfo._ip << endl;
  cout << rdinfo._port << endl;
  return 0;
}


注:相比于C语言方便很多,不用控制格式


六、stringstream的介绍和使用


  • 引入:


在C语言中将一个整形变量的数据转化为字符串格式的方式有:


  1. 使用itoa()函数


  1. 使用sprintf()函数


  • 注意:


两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃


  • 示例:


void test()
{
  int n = 123456789;
  char s1[32];
  _itoa(n, s1, 10);
  char s2[32];
  sprintf(s2, "%d", n);
  char s3[32];
  sprintf(s3, "%f", n);
}


在C++中,对此问题引入了stringstream类


注意:

使用时需包含头文件sstream,在sstream头文件下,标准库三个类:istringstream、ostringstream 和 stringstream,分别用来进行流的输入、输出和输入输出操作


stringstream作用:

将数值类型数据格式化为字符串

示例:


#include<sstream>
void test_stringstream1()
{
  int a = 12345678;
  string sa;
  // 将一个整形变量转化为字符串,存储到string类对象中
  stringstream s;
  s << a;
  s >> sa;
    cout << sa << endl;
  // clear()
  // 注意多次转换时,必须使用clear将上次转换状态清空掉
  // stringstreams在转换结尾时(即最后一个转换后),会将其内部状态设置为badbit
  // 因此下一次转换是必须调用clear()将状态重置为goodbit才可以转换
  // 但是clear()不会将stringstreams底层字符串清空掉
  // s.str("");
  // 将stringstream底层管理string对象设置成"",
  // 否则多次转换时,会将结果全部累积在底层string对象中
  s.str("");
  s.clear(); // 清空s, 不清空会转化失败
  double d = 12.34;
  s << d;
  s >> sa;
  string sValue;
  sValue = s.str(); // str()方法:返回stringsteam中管理的string类型
  cout << sValue << endl;
}


  1. 字符串拼接


  • 示例:


void test_stringstream2()
{
  stringstream sstream;
  // 将多个字符串放入 sstream 中
  sstream << "first" << " " << "string,";
  sstream << " second string";
  cout << "strResult is: " << sstream.str() << endl;
  // 清空 sstream
  sstream.str("");
  sstream << "third string";
  cout << "After clear, strResult is: " << sstream.str() << endl;
}


注意:

stringstream实际是在其底层维护了一个string类型的对象用来保存结果


多次数据类型转化时,一定要用clear()来清空,才能正确转化,但clear()不会将stringstream底层的string对象清空


可以使用s. str("")方法将底层string对象设置为""空字符串


可以使用s.str()将让stringstream返回其底层的string对象


stringstream使用string类对象代替字符数组,可以避免缓冲区溢出的危险,而且其会对参数类型进行推演,不需要格式化控制,也不会出现格式化失败的风险,因此使用更方便,更安全


相关文章
|
3月前
|
网络协议 安全 Linux
Linux C/C++之IO多路复用(select)
这篇文章主要介绍了TCP的三次握手和四次挥手过程,TCP与UDP的区别,以及如何使用select函数实现IO多路复用,包括服务器监听多个客户端连接和简单聊天室场景的应用示例。
105 0
|
3月前
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
138 1
Linux C/C++之IO多路复用(aio)
|
6天前
|
C++ 开发者
C++学习之继承
通过继承,C++可以实现代码重用、扩展类的功能并支持多态性。理解继承的类型、重写与重载、多重继承及其相关问题,对于掌握C++面向对象编程至关重要。希望本文能为您的C++学习和开发提供实用的指导。
37 16
|
24天前
|
算法 网络安全 区块链
2023/11/10学习记录-C/C++对称分组加密DES
本文介绍了对称分组加密的常见算法(如DES、3DES、AES和国密SM4)及其应用场景,包括文件和视频加密、比特币私钥加密、消息和配置项加密及SSL通信加密。文章还详细展示了如何使用异或实现一个简易的对称加密算法,并通过示例代码演示了DES算法在ECB和CBC模式下的加密和解密过程,以及如何封装DES实现CBC和ECB的PKCS7Padding分块填充。
45 4
2023/11/10学习记录-C/C++对称分组加密DES
|
5月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
95 0
|
3月前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
|
3月前
|
Linux C++
Linux C/C++之IO多路复用(poll,epoll)
这篇文章详细介绍了Linux下C/C++编程中IO多路复用的两种机制:poll和epoll,包括它们的比较、编程模型、函数原型以及如何使用这些机制实现服务器端和客户端之间的多个连接。
53 0
Linux C/C++之IO多路复用(poll,epoll)
|
3月前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
34 1
|
5月前
|
算法 C语言 C++
【C++航海王:追寻罗杰的编程之路】C++的IO流
【C++航海王:追寻罗杰的编程之路】C++的IO流
42 2
|
6月前
|
存储 安全 编译器
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)
【C++入门 四】学习C++内联函数 | auto关键字 | 基于范围的for循环(C++11) | 指针空值nullptr(C++11)