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

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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 关联规则延伸之协同过滤
  • Python魔法之旅-魔法方法(22)
  • kafka-生产者监听器(SpringBoot整合Kafka)
  • The First项目报告:Stargate Finance重塑跨链金融的未来
  • Vxe UI vxe-form 实现折叠表单,当表单很多时实现自动收起与展开
  • 独具魅力的 App UI 风格才能称之为优秀
  • 66. UE5 RPG 实现远程攻击武器配合角色攻击动画
  • 1. 面向对象的由来
  • MyBatis面试题系列三
  • 何为屎山代码?
  • Facebook海外户|如何制作出引人注目的Facebook广告素材?
  • lua vm 五: upvalue
  • django ORM model update常规用法
  • java面试题:java三大特性多态又是如何实现的
  • 作文笔记11 推荐一本书
  • ComponentOne 2017 V2版本正式发布
  • css的样式优先级
  • gitlab-ci配置详解(一)
  • laravel5.5 视图共享数据
  • MySQL-事务管理(基础)
  • pdf文件如何在线转换为jpg图片
  • Vue小说阅读器(仿追书神器)
  • 仿天猫超市收藏抛物线动画工具库
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 前端
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 什么是Javascript函数节流?
  • 微信小程序--------语音识别(前端自己也能玩)
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 优化 Vue 项目编译文件大小
  • 由插件封装引出的一丢丢思考
  • 怎么将电脑中的声音录制成WAV格式
  • Java性能优化之JVM GC(垃圾回收机制)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (10)ATF MMU转换表
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (C#)Windows Shell 外壳编程系列9 - QueryInfo 扩展提示
  • (附源码)ssm跨平台教学系统 毕业设计 280843
  • (面试必看!)锁策略
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)
  • (转)ABI是什么
  • .net core 6 redis操作类
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • @31省区市高考时间表来了,祝考试成功
  • @Value获取值和@ConfigurationProperties获取值用法及比较(springboot)
  • []指针
  • [20150321]索引空块的问题.txt
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [CentOs7]iptables防火墙安装与设置
  • [DevEpxress]GridControl 显示Gif动画
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream
  • [FC][常见Mapper IRQ研究]