C++ Stream详解

一、从C Stream读取

C Stream是C语言中进行标准输入输出操作的方式。C++在继承C语言的同时也继承了这种方式,通过使用C Stream,我们可以向同一个设备中进行不同格式的输入输出。

C++ Stream提供了iostream头文件,通过读写字符序列来执行各种操作。

#include 
using namespace std;

int main() {
   char str[50];

   cout <> str;
   cout << "你输入的字符串是: " << str << endl;

   return 0;
}

以上代码中,我们使用了cin和cout流来进行输入输出。cin用于输入,它会等待用户输入,直到按下回车键后结束输入。cout用于输出,在这个例子中,我们输入一个字符串,然后使用cout输出它。

二、C Stream Reader类

在C++中,我们可以通过定义C Stream Reader类来使用C stream。这一类提供了一个基本的方法,可以读取从流中输入的字符。

以下是一个实现从流中读取的示例代码:

#include 
#include 
#include 

using namespace std;

int main() {
    ifstream myfile("example.txt");
    string line;

    if (myfile.is_open()) {
        while (getline(myfile,line)) {
            cout << line << '\n';
        }
        myfile.close();
    }
    else cout << "无法打开文件";

    return 0;
}

在上面的代码中,我们定义了一个名为myfile的对象,并使用它打开了一个名为”example.txt”的文件。

在程序中,我们使用了ifstream类来进行文件输入,对于这个类,我们还可以使用ofstream类来进行文件输出。

三、C Stream函数

C++ Stream还提供了大量的函数帮助我们进行流操作。常见的流函数包括put、get、write、read、istringstream、ostringstream等。

以下是一个C++ Stream函数的示例代码:

#include 
#include 
#include 

using namespace std;

int main() {
    int x = 5, y = 10, z;
    stringstream ss;

    ss << x << ' ' <> z;
    cout << z <> z;
    cout << z << endl;

    return 0;
}

在上面的代码中,我们使用了stringstream 定义了一个名为ss的对象。然后将一个整型数x和一个空格字符‘ ‘写入到该对象中。接着从该对象中取出两个整数,并分别赋值给变量z,最后将它们输出。

四、C Stream转换JSON

C++ Stream还可以将C++对象转换成JSON字符串。在这个过程中,我们可以使用nlohmann_json库,它是一个基于模板的JSON库,支持C++ 11。

以下是一个将class对象转换成JSON字符串的示例代码:

#include 
#include 
#include 
#include "json.hpp"

using json = nlohmann::json;

class Person {
public:
    Person() {}
    Person(std::string name, int age) : name(name), age(age) {}

    std::string getName() const { return name; }
    void setName(std::string name) { this->name = name; }
    int getAge() const { return age; }
    void setAge(int age) { this->age = age; }

private:
    std::string name;
    int age;
};

int main() {
    Person p("John Doe", 32);

    json j;
    j["name"] = p.getName();
    j["age"] = p.getAge();
    std::string jsonStr = j.dump(4);

    std::cout << jsonStr << std::endl;

    return 0;
}

以上代码中,我们定义了一个Person类和一个名为j的json对象。通过使用j对象将Person对象(p)的数据导入json中,最后使用j.dump(4) 方法将json转换为具有缩进的JSON字符串。

五、C Stream存储

我们可以通过文件将C++对象存储到本地磁盘。使用二进制文件进行存储的优点是文件大小较小,但它们只能在相同的机器上使用,在另一台机器上使用文件可能会出现不兼容的问题。使用文本文件进行存储的优点是它们是可移植的。

以下是一个二进制文件存储的示例代码:

#include 
#include 
#include 

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector people {
        { "Alice", 22 },
        { "Bob", 31 },
        { "Charlie", 45 }
    };

    std::ofstream file("people.bin", std::ios::binary);
    for (const auto& person : people) {
        file.write(reinterpret_cast(&person), sizeof(Person));
    }

    return 0;
}

以上代码中,我们定义了一个Person结构体和一个人物向量。然后使用文件输出流将people向量中的Person对象存储到一个名为people.bin的文件中。

六、C Stream原理

C++ stream是一个系统级别的类库,使用了一对单向管道,一端为输入,另一端为输出。在输入端,我们可以使用istream来进行各种形式的输入,而在输出端,我们则可以使用ostream进行各种形式的输出。在实际操作中,我们可使用std::cout来进行输出(代替stdout)。在C++ stream内部,它会根据输出缓冲的大小决定何时输出数据。

七、C Stream没有长度

C++ stream没有一个固定的长度,我们可以根据需要动态的分配内存。

以下是一个动态分配内存的示例代码:

#include 
#include 
#include 

class Person {
public:
    Person(const std::string &name, int age) : name(name), age(age) {}

    std::string toString() const {
        std::ostringstream oss;
        oss << "Name: " << name << "; Age: " << age << '\n';
        return oss.str();
    };

private:
    std::string name;
    int age;
};

int main() {
    Person p1("John Doe", 32);
    Person p2("Jane Doe", 28);

    std::ostringstream oss;
    oss << p1.toString() << p2.toString();

    std::cout << oss.str();

    return 0;
}

在上面的代码中,我们使用std::ostringstream顺序地将两个Person对象(p1和p2)的数据保存在内存中。最后,我们使用std::cout将其输出到屏幕上。

八、C Stream限速

C++ Stream支持限速,我们可以使用std::this_thread::sleep_for()函数来对流的流量进行限制。

以下是一个限制文件输出速度的示例代码:

#include 
#include 
#include 
#include 

struct Person {
    std::string name;
    int age;
};

int main() {
    std::vector people {
        { "Alice", 22 },
        { "Bob", 31 },
        { "Charlie", 45 }
    };

    std::ofstream file("people.txt");
    for (const auto& person : people) {
        auto str = person.name + " " + std::to_string(person.age) + "\n";
        file.write(str.c_str(), str.size());
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }

    return 0;
}

以上代码中,我们使用std::this_thread::sleep_for()函数对文件的输出速率进行限制。每一秒钟输出一条记录。

九、C Stream保存到数据库

C++ Stream 与数据库的结合使用可以让我们轻松地将数据从C++对象导入到数据库中。我们可以使用数据库提供的API,并且可以在C++中使用不同的库来与不同类型的数据库交互。

以下是一个使用sqlite3数据库进行操作的示例代码:

#include 
#include 
#include 
#include 

struct Person {
    std::string name;
    int age;
};

int main(int argc, char* argv[]) {
    std::vector people{
        {"Alice", 22},
        {"Bob", 31},
        {"Charlie", 45}
    };

    sqlite3* db;
    char* errMsg;
    int rc = sqlite3_open("test.db", &db);
    if (rc != SQLITE_OK) {
        std::cerr << "无法打开数据库: " << sqlite3_errmsg(db) << '\n';
        sqlite3_close(db);
        return -1;
    }

    rc = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS people(name TEXT, age INT)", nullptr, nullptr, &errMsg);
    if (rc != SQLITE_OK) {
        std::cerr << "无法执行语句: " << errMsg << '\n';
        sqlite3_free(errMsg);
        sqlite3_close(db);
        return -1;
    }

    for (const auto& person : people) {
        std::string sql = "INSERT INTO people VALUES('" + person.name + "', " + std::to_string(person.age) + ")";
        rc = sqlite3_exec(db, sql.c_str(), nullptr, nullptr, &errMsg);
        if (rc != SQLITE_OK) {
            std::cerr << "无法执行语句: " << errMsg << '\n';
            sqlite3_free(errMsg);
            sqlite3_close(db);
            return -1;
        }
    }

    sqlite3_close(db);
    return 0;
}

以上代码中,我们使用了sqlite3开源数据库与C++ Stream进行交互。在程序中,我们创建了一个名为People的std::vector可以从中导入数据。然后使用sqlite3库在一个名为test.db的数据库中创建了一个名为people的表,并将people向量中的Person对象插入到该表中。

原创文章,作者:GBSLO,如若转载,请注明出处:https://www.506064.com/n/372846.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
GBSLOGBSLO
上一篇 2025-04-25 15:26
下一篇 2025-04-25 15:26

相关推荐

  • 如何使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnotempty(

    本文将详细介绍如何在Java编程中使用integratecustomerdata.stream().filter(c->{ if (collectionutil.isnote…

    编程 2025-04-28
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • Java BigDecimal 精度详解

    一、基础概念 Java BigDecimal 是一个用于高精度计算的类。普通的 double 或 float 类型只能精确表示有限的数字,而对于需要高精度计算的场景,BigDeci…

    编程 2025-04-25
  • nginx与apache应用开发详解

    一、概述 nginx和apache都是常见的web服务器。nginx是一个高性能的反向代理web服务器,将负载均衡和缓存集成在了一起,可以动静分离。apache是一个可扩展的web…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • Python安装OS库详解

    一、OS简介 OS库是Python标准库的一部分,它提供了跨平台的操作系统功能,使得Python可以进行文件操作、进程管理、环境变量读取等系统级操作。 OS库中包含了大量的文件和目…

    编程 2025-04-25
  • MPU6050工作原理详解

    一、什么是MPU6050 MPU6050是一种六轴惯性传感器,能够同时测量加速度和角速度。它由三个传感器组成:一个三轴加速度计和一个三轴陀螺仪。这个组合提供了非常精细的姿态解算,其…

    编程 2025-04-25

发表回复

登录后才能评论