C++中的常见I/O方式

目录

摘要

1. 标准输入输出(Standard I/O)

2. 文件输入输出(File I/O)

3. 字符串流(String Stream)

4. 低级文件I/O(Low-level File I/O)

5. 内存映射文件(Memory-Mapped File I/O)

6. 网络I/O(Network I/O)

服务器端

客户端


摘要

C++中的输入输出操作(I/O)方式多种多样,从简单的标准I/O到复杂的内存映射文件和网络I/O。每一种的用法都有其特别之处,下面会分别用代码的方式来简单介绍一些用法,可以根据自己项目所需来选择合适的I/O方式可以提高我们项目开发的效率。

1. 标准输入输出(Standard I/O)

标准输入输出用于与控制台进行交互。

#include <iostream>
#include <vector>
#include <string>
#include <sstream>
using namespace std;struct Student {string name;int age;vector<int> grades;void display() const {cout << "Name: " << name << ", Age: " << age << ", Grades: ";for (int grade : grades) {cout << grade << " ";}cout << endl;}
};int main() {vector<Student> students;string input;cout << "Enter student information (name age grades), type 'end' to stop:" << endl;while (true) {getline(cin, input);if (input == "end") break;istringstream iss(input);Student student;iss >> student.name >> student.age;int grade;while (iss >> grade) {student.grades.push_back(grade);}students.push_back(student);}cout << "Entered students:" << endl;for (const Student& student : students) {student.display();}return 0;
}

2. 文件输入输出(File I/O)

文件I/O操作允许将数据存储到文件中或从文件中读取。

#include <fstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;struct Employee {string name;int id;double salary;void display() const {cout << "Name: " << name << ", ID: " << id << ", Salary: " << salary << endl;}
};int main() {vector<Employee> employees = {{"Aoteman", 1, 50000},{"AotemanDaddy", 2, 60000},{"AotemanMami", 3, 70000}};ofstream outFile("employees.dat", ios::binary);if (!outFile) {cerr << "Error opening file for writing" << endl;return 1;}for (const Employee& emp : employees) {outFile.write((char*)&emp, sizeof(Employee));}outFile.close();vector<Employee> readEmployees;ifstream inFile("employees.dat", ios::binary);if (!inFile) {cerr << "Error opening file for reading" << endl;return 1;}Employee emp;while (inFile.read((char*)&emp, sizeof(Employee))) {readEmployees.push_back(emp);}inFile.close();cout << "Read employees:" << endl;for (const Employee& emp : readEmployees) {emp.display();}return 0;
}

3. 字符串流(String Stream)

字符串流用于处理内存中的字符串流。

#include <sstream>
#include <iostream>
#include <vector>
#include <string>
using namespace std;struct Product {string name;double price;int quantity;void display() const {cout << "Name: " << name << ", Price: " << price << ", Quantity: " << quantity << endl;}
};int main() {vector<Product> products = {{"Apple", 999.99, 5},{"HuaWei", 699.99, 10},{"SanXing", 299.99, 7}};ostringstream oss;for (const Product& prod : products) {oss << prod.name << " " << prod.price << " " << prod.quantity << "\n";}string productData = oss.str();cout << "Serialized products:\n" << productData;vector<Product> parsedProducts;istringstream iss(productData);string name;double price;int quantity;while (iss >> name >> price >> quantity) {parsedProducts.push_back({name, price, quantity});}cout << "Parsed products:" << endl;for (const Product& prod : parsedProducts) {prod.display();}return 0;
}

4. 低级文件I/O(Low-level File I/O)

低级文件I/O使用系统调用来进行文件操作,提供了更高的灵活性和控制力。

#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;struct Record {char name[20];int value;void display() const {cout << "Name: " << name << ", Value: " << value << endl;}
};int main() {vector<Record> records = {{"Record1", 100},{"Record2", 200},{"Record3", 300}};int fd = open("records.dat", O_WRONLY | O_CREAT, 0644);if (fd == -1) {cerr << "Error opening file for writing" << endl;return 1;}for (const Record& rec : records) {write(fd, &rec, sizeof(Record));}close(fd);vector<Record> readRecords;fd = open("records.dat", O_RDONLY);if (fd == -1) {cerr << "Error opening file for reading" << endl;return 1;}Record rec;while (read(fd, &rec, sizeof(Record)) > 0) {readRecords.push_back(rec);}close(fd);cout << "Read records:" << endl;for (const Record& rec : readRecords) {rec.display();}return 0;
}

5. 内存映射文件(Memory-Mapped File I/O)

内存映射文件将文件内容映射到进程的地址空间。

#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
using namespace std;struct Data {char text[50];int number;void display() const {cout << "Text: " << text << ", Number: " << number << endl;}
};int main() {int fd = open("mmapdata.dat", O_RDWR | O_CREAT, 0644);if (fd == -1) {cerr << "Error opening file" << endl;return 1;}Data data = {"Memory-mapped file example", 42};write(fd, &data, sizeof(Data));size_t filesize = sizeof(Data);Data *map = static_cast<Data*>(mmap(0, filesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0));if (map == MAP_FAILED) {cerr << "Error mapping file" << endl;close(fd);return 1;}// 修改映射区域内容strcpy(map->text, "Updated text");map->number = 99;// 取消映射munmap(map, filesize);close(fd);// 读取文件内容fd = open("mmapdata.dat", O_RDONLY);if (fd == -1) {cerr << "Error opening file" << endl;return 1;}Data readData;read(fd, &readData, sizeof(Data));close(fd);cout << "Read data:" << endl;readData.display();return 0;
}

6. 网络I/O(Network I/O)

网络I/O用于通过网络进行数据传输,涉及到套接字编程。

服务器端

#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
using namespace std;int main() {int server_fd = socket(AF_INET, SOCK_STREAM, 0);if (server_fd == -1) {cerr << "Error creating socket" << endl;return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(9090);server_addr.sin_addr.s_addr = INADDR_ANY;if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {cerr << "Error binding socket" << endl;close(server_fd);return 1;}if (listen(server_fd, 5) == -1) {cerr << "Error listening on socket" << endl;close(server_fd);return 1;}cout << "Server listening on port 9090..." << endl;int client_fd = accept(server_fd, nullptr, nullptr);if (client_fd == -1) {cerr << "Error accepting connection" << endl;close(server_fd);return 1;}char buffer[256];ssize_t bytesReceived = recv(client_fd, buffer, sizeof(buffer) - 1, 0);if (bytesReceived == -1) {cerr << "Error receiving data" << endl;close(client_fd);close(server_fd);return 1;}buffer[bytesReceived] = '\0';cout << "Received from client: " << buffer << endl;const char *response = "Message received";send(client_fd, response, strlen(response), 0);close(client_fd);close(server_fd);return 0;
}

客户端

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
using namespace std;int main() {int sockfd = socket(AF_INET, SOCK_STREAM, 0);if (sockfd == -1) {cerr << "Error creating socket" << endl;return 1;}struct sockaddr_in server_addr;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(9090);server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {cerr << "Error connecting to server" << endl;close(sockfd);return 1;}const char *msg = "Hello, server!";send(sockfd, msg, strlen(msg), 0);char buffer[256];ssize_t bytesReceived = recv(sockfd, buffer, sizeof(buffer) - 1, 0);if (bytesReceived == -1) {cerr << "Error receiving data" << endl;} else {buffer[bytesReceived] = '\0';cout << "Received from server: " << buffer << endl;}close(sockfd);return 0;
}

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

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

相关文章

《精通ChatGPT:从入门到大师的Prompt指南》第4章:避免常见错误

第4章&#xff1a;避免常见错误 在使用ChatGPT进行Prompt编写时&#xff0c;常见的错误可能会大大影响生成内容的质量和准确性。本章将详细讨论这些错误&#xff0c;并提供如何避免它们的建议。 4.1 不明确的指令 在使用ChatGPT时&#xff0c;一个常见的问题是指令不够明确。…

理解数仓建模

​​​在数仓建设的过程中&#xff0c;由于未能完全按照规范操作&#xff0c; 从而导致数据仓库建设比较混乱&#xff0c;常见有以下问题&#xff1a; 数仓常见问题 ● 数仓分层不清晰&#xff1a;数仓的分层没有明确的逻辑&#xff0c;难以管理和维护。 ● 数据域划分不明确…

[数据集][目标检测]高空抛物数据集VOC+YOLO格式259张+6段视频+yolov8模型+探讨

这个是从6段简短抛物视频里面截取的259张图片用labelImg进行标注得到提供voc和yolo格式以供大家训练和研究。目录我已经提供了yolov8s训练好的模型和训练日志&#xff0c;如果不想训练的可以直接用我这个模型即可&#xff0c;选择使用best.pt或last.pt即可。目录结构&#xff1…

【网络编程开发】10.UNIX套接字域

10.UNIX套接字域 UNIX域套接字是用于在同一台计算机上运行的进程之间进行通信的一种机制。它与传统基于TCP/IP协议栈的套接字不同&#xff0c;UNIX域套接字操作更为高效&#xff0c;因为它避免了网络层的开销&#xff0c;不涉及网络报头、检验和、顺序号等复杂的网络协议处理过…

ANSYS APDL中使用SF和SFFUN命令,对不同节点施加不同大小的面载荷

SF命令通常是对 所选择的节点集合 施加同样大小的载荷&#xff0c;如&#xff1a; NSEL, S, LOC, Y, 5 ! 选择y坐标值为5的全部结点 SF, ALL, PRES, 1 ! 施加均布荷载 完整命令流&#xff1a; Finish !退出当前处理器 /Clear,al…

websocket发送数据

1. 使用JSON格式传输参数 可以使用库如Jackson或Gson来处理JSON。 客户端发送JSON消息&#xff1a; var socket new WebSocket("ws://localhost:8080/ws"); socket.onopen function() {var message {"action": "greet","name": …

tensorRT 自定义算子plugin的实现

文章目录 1. 自定义算子导出onnx1.1 自定义算子的实现类1.2 自定义算子类1.3 onnx导出2. 自定义算子plugin的实现2.1 Plugin类的实现2.1.1 构造函数的实现2.1.2 析构函数实现2.1.3 serialize函数的实现2.1.4 destory函数的实现2.1.5 enqueue函数的实现(关键)2.1.5.1 customSc…

C#操作MySQL从入门到精通(16)——使用子查询

前言: 我们在查询数据的过程中有时候查询的数据不是从数据库中来的,而是从另一个查询的结果来的,这时候就需要使用子查询,本文使用的测试数据如下: 1、子查询 下面的代码就是先查询地址是安徽和广西的学生年龄,然后获取年龄对应的姓名 private void button__SubQuery…

Spring boot+vue前后端分离

目录 1、前端vue的搭建 2、后端项目的构建 pom文件中引入的jar包 yml文件用来配置连接数据库和端口的设置 application.property进行一些整合 service层 imp层 mapper 实体类 额外写一个类、解决跨域问题 3、测试 1、前端vue的搭建 建立项目的过程略 开启一个建立好…

【SZUOJ】【高精度板子】E. 大整数计算(运算符重载)

被学校oj的高精度恶心到了&#xff0c;所以我觉得以后把它当板子 //??CBigInteger????? /********** Write your code here! **********/ #include<bits/stdc.h> using namespace std; class CBigInteger { public:vector<int> a;int si;CBigInteger(){si1…

用自然语言连接信息孤岛

信息孤岛互联互通的困难 尽管已经进入了互联网时代&#xff0c;信息系统中的信息孤岛现象仍然十分地严重&#xff0c;不同部门&#xff0c;不同机器之间难以实现信息的互联互通。存在大量的信息孤岛。 不同信息系统的相互通信依赖通信协议和数据模型的定义&#xff0c;前者决定…

上海安全员C证继续教育题库(附答案)

1.从业人员经过安全教育培训&#xff0c;了解岗位操作规程&#xff0c;但未遵守而造成事故的&#xff0c;行为人应负( )责任&#xff0c;有关负责人应负( )责任。 A.直接 间接 B.直接 领导 C.间接 管理D.直接 管理 2.对生产附着式升降脚手架产品的单位&#xff0c;必须…

Java数据结构与算法(买卖股票最佳时机​)

前言 买卖股票最佳时机和最长子数组和类似。暴力算法和动态规划算法几乎如出一辙。一个是前序和小于零时重置当前值&#xff0c;一个是最小值小于当前值时重置为最小值。需关注重置的计算规则和标志。 买卖股票对应leetcode . - 力扣&#xff08;LeetCode&#xff09; 实现…

一定要了解的 WordPress 数据库中默认 12 个表

WordPressan 安装的时候会有 12 张默认的数据表,每张表的数据都包含了 WordPress 不同的功能。看看这些表的结构,你能很容易的了解网站不同的部分都是存在哪里的。目前,默认的 WordPress 安装会创建如下的数据表。 注意:每张表名前面的 wp_ 是你在安装过程中选择的数据库前…

LeetCode 9 - 回文数

给你一个整数 x &#xff0c;如果 x 是一个回文整数&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 回文数是指正序&#xff08;从左向右&#xff09;和倒序&#xff08;从右向左&#xff09;读都是一样的整数。 例如&#xff0c;121 是回文&#xff0c;而…

【IoT NTN】3GPP R18中关于各类IoT设备在NTN中的增强和扩展

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

vue调用百度api时跨域问题的解决方案

最近在开发一个基于百度图片文字识别的功能&#xff0c;本来在后端调用百度api的接口&#xff0c;功能已经完成了&#xff0c;但是由于后端服务器不能访问外网&#xff0c;所以将调用百度api的功能需要移到前端&#xff0c;于是就一个坑接一个坑&#xff0c;好不容易开发完成&a…

Flink 入门案例介绍

一、工程搭建 在 IDEA 中创建一个 Maven 工程&#xff1a;FlinkTutorial 在 pom 文件中引入依赖&#xff1a; <dependencies><dependency><groupId>org.apache.flink</groupId><artifactId>flink-java</artifactId><version>1.10.1…

SAP ABAP 往数据库表里加数据

目录 方法一&#xff1a;SE16N SE11 方法二&#xff1a;创建维护VIEW&#xff1a;SE11 SM30 Error补充说明&#xff1a; 方法一&#xff1a;SE16N SE11 首先SE16N 进来。 进来之后在テーブル的位置输入表名&#xff0c;然后点击执行&#xff08;F8&#xff09; 如果第一次…

spring 解决循环依赖

在 spring 框架中&#xff0c;我们知道它是通过三级缓存来解决循环依赖的&#xff0c;那么它具体是怎么实现的&#xff0c;以及是否必须需要三级缓存才能解决循环依赖&#xff0c;本文来作相关介绍。 具体实现 先来看看它的三级缓存到底是什么&#xff0c;先看如下代码&#…