C++ ストリーム (ストリーム) の概要

C++ ストリーム (ストリーム) の概要

フレーム:

ここに画像の説明を挿入

C++ におけるストリームの概念

C++ ストリームには、次の概念が含まれます。

標準 I/O ストリーム: メモリと標準入出力デバイス間の情報の転送;
ファイル I/O ストリーム: メモリと外部ファイル間の情報の転送;
文字列 I/O ストリーム: 文字列ストリームを表すメモリ変数と文字 配列間の情報の受け渡し

STL で定義されたストリーム クラス:

ストリーム分類 ストリーム クラス名 フロー効果
ストリーム基本クラス iOS ストリームの状態を保存し、エラーを処理する、すべてのストリーム クラスの親クラス
入力ストリーム クラス ストリーム ストリーム基底クラスを入力し、フォーマットとアンフォーマットの間でストリーム バッファ内のデータを変換して入力します。
イフストリーム ファイル入力ストリーム クラス
ストストリーム C 型 string char* に基づいて記述された文字列入力ストリーム クラス
出力ストリーム クラス 私たちの敵 出力ストリーム基本クラスは、ストリーム バッファー内のデータをフォーマットとアンフォーマットの間で変換します。と出力
オフストリーム ファイル出力ストリーム クラス
オストストリーム C 型 string char* に基づいて記述された文字列入力ストリーム クラス
I/O ストリーム クラス iostream 多目的入出力ストリーム クラスの基底クラス
fストリーム ファイルストリーム入出力クラス
ストストリーム C 型 string char* に基づいて記述されたストリーム入出力クラス

ストリームの場合、2 組のクラスが提供されることに注意してください。1 つは C 型 string char * (ヘッダー ファイル strstream で定義) に基づいており、もう 1 つは std::string (sstream で定義) に基づいており、後者は C++ で推奨されています。の標準委員会。

ファイルストリーム

オープン方法
ここに画像の説明を挿入
上記のオープン方法はビット操作と組み合わせることができます |
ファイルに書き込みたい場合、ファイルが既に存在する場合、ファイルを切り捨てたい場合

fstream stream;
stream.open("demo.txt", ios::out | ios::trunc);

ファイルを読みたい、ファイルの最後を読みたい

fstrem inFile;
inFile.open("demo.txt", ios::in | ios::ate);

ファイル ストリーム バイナリの読み取りと書き込み

#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main() {
    
    

    ifstream infile;
    ofstream outfile;
    std::vector<char> buffer;

    infile.open("E:/Desktop/girl.jpg", std::ifstream::binary);

    //获取文件长度
    infile.seekg(0, std::ifstream::end);
    long size = infile.tellg();
    infile.seekg(0);

    //写入buffer
    buffer.resize(size);
    infile.read(&buffer[0], size);

    //写入二进制文件
    outfile.open("E:/Desktop/girl.bin", std::ofstream::binary);
    outfile.write(&buffer[0], buffer.size());

    infile.close();
    outfile.close();
}

ストリーム操作演算子 setiosflags を使用する

参考:リンク

ここに画像の説明を挿入
たとえば、次の 3 つのステートメントは次のとおりです。

#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
    
    
    int n = 141;
    //1) 分别以十六进制、十进制、八进制先后输出 n
    cout << "1)" << hex << n << " " << dec << n << " " << oct << n << endl;
    double x = 1234567.89, y = 12.34567;
    //2)保留5位有效数字
    cout << "2)" << setprecision(5) << x << " " << y << " " << endl;
    //3)保留小数点后面5位
    cout << "3)" << fixed << setprecision(5) << x << " " << y << endl;
    //4)科学计数法输出,且保留小数点后面5位
    cout << "4)" << scientific << setprecision(5) << x << " " << y << endl;
    //5)非负数显示正号,输出宽度为12字符,宽度不足则用 * 填补
    cout << "5)" << showpos << fixed << setw(12) << setfill('*') << 12.1 << endl;
    //6)非负数不显示正号,输出宽度为12字符,宽度不足则右边用填充字符填充
    cout << "6)" << noshowpos << setw(12) << left << 12.1 << endl;
    //7)输出宽度为 12 字符,宽度不足则左边用填充字符填充
    cout << "7)" << setw(12) << right << 12.1 << endl;
    //8)宽度不足时,负号和数值分列左右,中间用填充字符填充
    cout << "8)" << setw(12) << internal << -12.1 << endl;
    cout << "9)" << 12.1 << endl;
    return 0;
}

出力は次のとおりです。

1)8d 141 215
2)1.2346e+06 12.346
3)1234567.89000 12.34567
4)1.23457e+06 1.23457e+01
5)***+12.10000
6)12.10000****
7)****12.10000
8)-***12.10000
9)12.10000

フリーオープンをリダイレクト

#include <iostream>
using namespace std;
int main()
{
    
    
    int x,y;
    cin >> x >> y;
    freopen("test.txt", "w", stdout);  //将标准输出重定向到 test.txt文件
    if( y == 0 )  //除数为0则输出错误信息
        cerr << "error." << endl;
    else
        cout << x /y ;
    return 0;
}

おすすめ

転載: blog.csdn.net/weixin_40011280/article/details/126005966