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/zh-tw/n/372846.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GBSLO的頭像GBSLO
上一篇 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

發表回復

登錄後才能評論