c++IO

ops/2024/9/22 13:55:48/

前言

大家好,我是jiantaoyab,本篇文章给大家介绍c++中文件操作

先回忆一下c语言文件操作

void Test_c_bin()
{//二进制写ServerInfo info = { "127.0.0.1", 8080 };FILE* fout = fopen("test.bin", "wb");fwrite(&info, sizeof(info), 1, fout);//二进制读 FILE* fin = fopen("test.bin", "rb");ServerInfo info;fread(&info, sizeof(info), 1, fin);std::cout << info._ip << ":" << info._port << std::endl;
}void Test_c_text()
{//文本写ServerInfo info = { "127.0.0.1", 8080};FILE* fout = fopen("test.txt", "w");fprintf(fout, "%s\n%d", info._ip, info._port);//文本读ServerInfo info;FILE* fin = fopen("test.txt", "r");fscanf(fin,"%s%d", info._ip, &info._port);printf("%s:%d\n", info._ip, info._port);
}

再看看c++中流的概念,是对一种有序连续且具有方向性的数据(单位可以是bit,byte,packet 的抽象描述。C++流是指信息从外部输入设备(如键盘)向计算机内部(如内存)输入和从内存向外部输出设备(显示器)输出的过程。这种输入输出的过程被形象的比喻为“流”。它的特性是:有序连续、具有方向性。为了实现这种流动,C++定义了I/O标准类库,这些每个类都称为流/流类,用以完成某方面的功能。

IO_42">c++ IO

image-20240420113303615

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类。

C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标
准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象。

注意

  1. cin为缓冲流。键盘输入的数据保存在缓冲区中,当要提取时,是从缓冲区中拿。如果一次输入过多,会留在那儿慢慢用,如果输入错了,必须在回车之前修改,如果回车键按下就无法挽回了。只有把输入缓冲区中的数据取完后,才要求输入新的数据
  2. 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入。但如果是字符型和字符串,则空格(ASCII码为32)无法用cin输入,字符串中也不能有空格。回车符也无法读入
  3. 输入的数据类型必须与要提取的数据类型一致,否则出错。出错只是在流的状态字state中对应位置位(置1),程序继续。

C++根据文件内容的数据格式分为二进制文件和文本文件,ifstream (只输入用)、ofstream(只输出用)、fstream(既输入又输出用)。

文本写文件

  1. 包含头文件:#include
  2. 创建文件流对象: ofstream ofs;
  3. 以写入方式打开文件:ofs.open(“文件路径”,ios::out);
  4. 写入内容:ofs<<“写入内容”;
  5. 关闭文件:ofs.close();

image-20240420114040616

#include<iostream>
#include<fstream>
using namespace std; 
void()
{ofstream ofs;ofs.open("test.txt", ios::out);ofs << "hello world" << endl;ofs.close();return 0;
}

文本读文件

  1. 包含头文件:#include

  2. 创建流对象:ifstream ifs;

  3. 以读取模式打开文件:ifs.open(“文件路径+文件名/文件名”,ios::in)

  4. 读取数据:常用的有4中方法

    • ifs>> int,char,float,char *,string 等等。可读取整形、浮点型、字符型、字符串等等,读取字符串时可将读取内容存入字符数组,也可存入string;读取字符串时一次读一行,遇到空格、制表符、换行符或读取到字符数组长度-1个字符时返回。读取成功返回istream&,读取失败返回false。

    • ifs.getline(char *buf,int size,char delim=‘\n’);

      一次读取一行,存入字符数组;遇到换行符或者读取到sizeof(buf)-1个字符返回(最后一个字符需要自动添加结束字符\0);遇到限定字符delim提前返回。读取失败返回false。

    • getline(istream& ifs,string& str,char delim=‘\n’);一次读取一行,存入字符串;遇到换行符和限定字符delim提前返回。读取失败返回false。

    • int get();/ istream& get(char *buf, int size,char delim=‘\n’);/istream& get(char c)

      常用的ifstream成员get函数有这几种重载;同样读取内容存入字符数组时遇到限定字符delim时提前返回,后面两种读取失败返回false。

#include<iostream>
#include<fstream>
using namespace std;
#include<string>
//方法1
void func(ifstream& ifs, string buf) {while (ifs >> buf) {cout << buf << endl;}
}
//方法2
void func(ifstream& ifs, char buf[1024]) {while (ifs.getline(buf, 1024)){cout << buf1 << endl;}
}
//方法3
void func(ifstream& ifs, string& buf) {while (getline(ifs, buf)) {cout << buf << endl;}
}
//方法4
void func(ifstream& ifs, char c) {while (ifs.get(c)) {cout << c;}
}

二进制写

  1. 包含头文件:#include

  2. 创建文件流:ofstream ofs;

  3. 以二进制方式打开文件:

    ofs.open(“文件名”,ios::binary|ios::out);

  4. 写入数据:调用成员函数

    ostream& write(const char * buffer,int len); ofs.write((const char*)ptr,sizeof(*ptr));

    字符指针buffer指向内存中一段储存空间,len是要写入字节数。

  5. 关闭文件:ofs.close();

二进制读

  1. 包含头文件:#include

  2. 创建文件流:ifstream ifs;

  3. 以二进制方式打开文件:

    ifs.open(“文件名”,ios::binary|ios::in);

  4. 读取数据:

    调用成员函数ifstream& read((char*)buf,sizeof(buf));

    buf是读取内容的缓存区强转为(char*),按照单个字节计算读取内容。

  5. 关闭文件:ifs.close();

写成一个类

#include<iostream>
#include<string>
#include<fstream>struct ServerInfo
{char _ip[32];int _port;
};//ifstream 输入 ofstream 输出
class Config
{
public:Config(const char* filename):_filename(filename){}void WriteBin(ServerInfo& info){std::ofstream ofs(_filename.c_str(), std::ios_base::out | std::ios_base::binary);ofs.write((const char*)&info, sizeof(ServerInfo));}void ReadBin(ServerInfo& info){std::ifstream ifs(_filename.c_str(), std::ios_base::in | std::ios_base::binary);ifs.read((char*)&info, sizeof(ServerInfo));}void WriteText(ServerInfo& info){std::ofstream ofs(_filename.c_str());ofs << info._ip <<" "<< info._port;}void ReadText(ServerInfo& info){std::ifstream ifs(_filename.c_str());ifs >> info._ip >> info._port;}
private:std::string _filename;
};int main()
{ServerInfo info = { "127.0.0.1", 8080 };//Test_c_bin();//Test_c_text();//二进制//Config cm("config.bin");//cm.WriteBin(info);//cm.ReadBin(info);//std::cout << info._ip << ":" << info._port << std::endl;//文本/*Config cm("config.bin");cm.WriteBin(info);cm.ReadBin(info);std::cout << info._ip << ":" << info._port << std::endl;*/
}

http://www.ppmy.cn/ops/4086.html

相关文章

微服务中Dubbo通俗易懂讲解及代码实现

当你在微服务架构中需要不同服务之间进行远程通信时&#xff0c;Dubbo是一个优秀的选择。Dubbo是一个高性能的Java RPC框架&#xff0c;它提供了服务注册、发现、调用、负载均衡等功能&#xff0c;使得微服务之间的通信变得简单而高效。 让我们来看一下Dubbo的通俗易懂的解释和…

windows ubuntu子系统,单细胞篇 1.cellranger安装与分析

这几天&#xff0c;我将单细胞测序在windows ubuntu子系统中跑了一遍&#xff0c;将过程分享給大家。 单细胞测序conda create -n 10xdb #创建环境 conda activate 10xdbconda install -c bioconda cellranger -y #失败&#xff0c;可能源中没有 wget -O cellranger-7.…

动态内存管理

为什么要进行动态内存分配 在之前的学习中&#xff0c;我们开辟内存空间都是固定的&#xff0c;例如 int a 0;//开辟4个字节的内存空间 int char[10] { 0 };//开辟10个字节的连续内存空间 但是&#xff0c;如果遇到不知道或者不确定要但是内存空间的时候&#xff0c;这样显…

SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测

SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测 目录 SCI一区 | Matlab实现POA-TCN-BiGRU-Attention鹈鹕算法优化时间卷积双向门控循环单元注意力机制多变量时间序列预测预测效果基本介绍模型描述程序设计参考…

玩鸿蒙项目来了,请尝鲜

文章目录 前言玩鸿蒙项目的介绍效果截图总结 一、前言 记得拉倒底看效果图。 鸿蒙开发热潮已经来了&#xff0c;大家学习热情还是很大的&#xff0c;还有就是华为生态学堂线下的举办&#xff0c;很多都入局了。 鸿蒙要想快速上手&#xff0c;那么就要自己开始去写页面&…

Arch 搭建 qemu riscv64 虚拟机

Arch 搭建 qemu riscv64 虚拟机 由于 u-boot 已经存在与 AUR 中&#xff0c;所以这里直接采用 Arch 对虚拟机进行搭建&#xff0c;或者我们可以将需要的环境拷贝到任意系统中运行也可以 这里我采用 docker 的方式进行运行&#xff0c;已经搭载好环境的 docker 放在了 docker …

Since Maven 3.8.1 http repositories are blocked.

编译maven 项目时候报错提示下面信息&#xff1a; Since Maven 3.8.1 http repositories are blocked.Possible solutions: - Check that Maven settings.xml does not contain http repositories - Check that Maven pom files do not contain http repository http://XXXXXX:…

记录一下易语言post get使用WinHttp的操作

最近在学易语言&#xff0c;在进行通讯的时候&#xff0c;出现一些问题&#xff0c;现在记录下来&#xff0c;避免以后继续忘记&#xff0c; 先声明文本型变量jsonPostData jsonPostData &#xff1d; “{hostname:” &#xff0b; hostnameTxt &#xff0b; “,hardcode:” &…