[C ++]入出力ストリーム(IOストリーム)


1.C言語の入出力

C言語で最も一般的に使用される入力および出力メソッドは、scanf()およびprintf()です。scanf()は、標準の入力デバイス(キーボード)からデータを読み取り、その値を1つまたはいくつかの変数に格納します。printf()は、指定されたテキスト/文字列を標準出力します。

C言語は、入力と出力に対応するバッファーを使用します。以下に示すように:

ここに画像の説明を挿入

入力バッファと出力バッファの理解:

  1. 低レベルIOの実装はシールドできます。低レベルIOの実装は、通常、オペレーティングシステムカーネルの実装に依存します。違いのこの部分をシールドできれば、ポータブルプログラムを簡単に作成できます。
  2. 「行」の読み取り動作を実現できます。コンピュータの場合、「行」の概念はありませんが、この部分では「行」の概念を定義し、バッファの内容を解析して返すことができます。 「行」「。

2.フローとは

「流れ」とは、物質がある場所から別の場所に流れるプロセスである流れを意味します。具体的には、順序付けられた連続的で方向性のあるデータの抽象的な記述です(単位はビット、バイト、パケットの場合があります)。

C ++ストリームとは、外部入力デバイス(キーボードなど)からコンピューターの内部(メモリなど)に情報を入力し、メモリから外部出力デバイス(ディスプレイ)に出力するプロセスを指します。この入出力プロセスは、鮮やかに「フロー」に例えられます。

その特徴は次のとおりです。整然とした、継続的な、そして方向性

このようなフローを実現するために、C++はI/ O標準クラスライブラリを定義しています。これらの各クラスはフローまたはフロークラスと呼ばれ、特定の機能を完了するために使用されます。これらのフローを以下に紹介します。


3、C++IOストリーム

1。概要

次の図に示すように、C++システムはクラスの巨大なライブラリを実装しています。その中で、iosは基本クラスであり、他のクラスはiosクラスから直接または間接的に派生します。
ここに画像の説明を挿入


2.標準IOストリーム

(1)cin、cout、cerr、clog

C ++標準ライブラリは、4つのグローバルストリームオブジェクトcin、cout、cerr、およびclogを提供します。標準出力にはcoutを使用します。つまり、データはメモリからコンソール(ディスプレイ)に流れます。標準入力にはcinを使用します。つまり、データはキーボードからプログラムに入力されます。標準エラー出力にはcerrを使用し、ログにはclogを使用します。出力。

前の図からわかるように、cout、cerr、およびclogはostreamクラスの3つの異なるオブジェクトであるため、これら3つのオブジェクトは基本的に同じですが、アプリケーションのシナリオは異なります。

下図のように、すべてディスプレイに出力されます。本来の目的は、一般出力にcout、エラー出力にcerr、ログ出力にclogを使用することですが、一般的に後者の2つはほとんど使用されず、coutが使用されます。すべての出力に対して。

結果は次のとおりです。
ここに画像の説明を挿入


(2)cin、coutおよびscanf、printf

C ++はcin、coutを提供し、C言語はscanf、printfを提供し、入力と出力の両方が可能ですが、最初にcinとcoutを使用することをお勧めします。フォーマットされた入力と出力に遭遇した場合は、scanf、printfを使用してください(cin、coutもフォーマットできます)入力と出力ですが、使用するのはより複雑です。既製のscanf、printf)を直接使用することをお勧めします。

同時に、C ++はいくつかの点でC言語とはかなり異なるため、4つの入力と出力の混合で問題が発生する場合があります。

たとえば、文字列はサイズ値を使用してC ++で文字列の終わりをマークしますが、C言語では、「\ 0」を使用して文字列の終わりをマークします。この違いにより、入出力中に問題が発生する可能性があります。このため、文字列c_str()もC言語での操作用に特別に提供されています。


(3)入出力の過負荷

Cinとcoutは、組み込み型(int、doubleなど)と一部の標準カスタム型(stringなど)を直接入力および出力できます。これは、標準ライブラリがこれらすべての型の入力と出力をオーバーロードしているためです。直接使用できます。

ここに画像の説明を挿入

カスタムタイプの場合、入力と出力にcinとcoutを直接使用する場合は、>>と<<を自分でオーバーロードする必要があります。そうしないと、直接使用できません。


(4)getline

scanfと同様に、cinもデータをスペースと改行で分割するため、スペースを含むデータの行の場合、すべてを読み取ることはできません。この場合、getlineが使用され、getlineは次のようにデータを改行で分割します。図。。

結果は次のとおりです。
ここに画像の説明を挿入


(5)ループ入力

複数行のコンテンツを入力する場合は、次の解決策を使用できます。

結果は次のとおりです
ここに画像の説明を挿入
。C言語と同様です。

char buffer[100];
while(scanf("%s", buffer) != EOF)
{
    
    
	//...
}

Ctrl + Cを使用して入力を終了できます。その本質はプロセスに信号を送信することです。詳細については、LinuxとWindowsで同じ[1万文字の詳細なLinuxシリーズ]のプロセス信号を確認できます。


2.ファイルストリームfstream

(1)ifstream、ofstream

ifstreamは、次のようにオブジェクトを作成します。ここで、nameはファイル名、modeは操作モードです。

ifstream ifs(name, mode);

選択できるモードは次のとおりです。

ここに画像の説明を挿入

ifstreamオブジェクトから呼び出すことができるメンバー関数は、一般的にget、getline、read、seekg、tellgなどで使用されます。関数名を見ると、それが何をするのかについての一般的な考えを得ることができます。getは一度に1文字ずつファイルを取得し、getlineは一度に1行ずつファイルを取得し、readはファイルからコンテンツの一部を読み取り、seekgはファイルポインタの位置を設定し、tellgはファイルポインタの位置を検出します。


(2)使用法

  1. ファイルストリームオブジェクトを定義します:ifstream(入力のみ)、ofstream(出力のみ)、fstream(入力と出力の両方)
  2. ファイルストリームオブジェクトのメンバー関数を使用してディスクファイルを開き、ファイルストリームオブジェクトとディスクファイルの関係を確立します。
  3. 抽出および挿入演算子を使用したファイルの読み取りおよび書き込み操作、または読み取りおよび書き込みを行うメンバー関数
  4. ファイルを閉じる

C言語の使用法に似ています

次の2つのコードは、それぞれifstreamとofstreamのファイルの読み取りと書き込みを示しています。書き込み方法は、C言語のfreadとfwriteのインターフェイスに似ていますが、オブジェクト指向になっています。

次のコードは、ifstreamを使用してファイルの内容を読み取ります。

結果は次のとおりです。
ここに画像の説明を挿入


次のコードは、ofstreamを使用してコンテンツをファイルに書き込むためのものです。使用方法は、基本的にifstreamと同じです。

結果は次のとおりです。
ここに画像の説明を挿入


C++の使用法

以下は、C ++が提供するファイルストリームの新しい使用法です。ファイルストリームもストリームであるため、<<または>>を使用して読み取りと書き込みを行うこともできます。使用法は次のとおりです。

コードは次のように表示されます。

void WriteFile()
{
    
    
	//类似于C语言的用法
	//ofstream ofs("write.txt");
	//ofs.put('h');
	//char msg[] = "ello world";
	//int size = sizeof(msg);
	//ofs.write(msg, size);
	//可调可不调,因为ofs出了作用域后析构函数会自动调用
	//ofs.close();

	//C++的新用法
	ofstream ofs("write.txt");
	char c = 'h';
	string str = "ello world";

	ofs << c << str;
}

int main()
{
    
    
	WriteFile();
	return 0;
}

このようにして、ofstreamオブジェクトは、coutのようにストリームを介してファイルにコンテンツを書き込むこともできます。

結果は次のとおりです。
ここに画像の説明を挿入

ifstreamの使用法は同じですが、ストリームの方向を逆にする必要があるため、ここでは詳しく説明しません。


3.文字列ストリームsstream

sstreamには、ストリームの入力、出力、および入出力操作に使用されるistringstream、ostringstream、およびstringstreamが含まれますが、通常、stringstreamを直接使用する方が便利です。

(1)読む

コードは次のように表示されます。

#include <sstream>
#include <iostream>

using namespace std;

struct ServerInfo//一个简单的结构体
{
    
    
	string ip;
	int port;
};

int main()
{
    
    
	stringstream ss;//定义一个对象
	ServerInfo info = {
    
     "192.0.0.1",8081 };//初始化

	ss << info.ip << " "  << info.port;//将info的两个成员流入ss
	string str = ss.str();//通过成员函数str()拿到ss内存储的字符串
	cout << str << endl;//打印

	return 0;
}

実行結果は次のとおりです。文字列の処理は非常に便利です。

結果は次のとおりです。
ここに画像の説明を挿入


(2)書く

前回の読み取りに基づいて、読み取りコンテンツを新しい構造に書き込みます。

コードは次のように表示されます。

#include <sstream>
#include <iostream>

using namespace std;

struct ServerInfo
{
    
    
	string ip;
	int port;
};

int main()
{
    
    
	stringstream ss;
	ServerInfo info = {
    
     "192.0.0.1",8081 };

	ss << info.ip << " " << info.port;
	
	//将s中的内容又写入newInfo中
	//注意:不同项的内容必须以空格或换行结尾,这是C/C++都要求的
	ServerInfo newInfo;
	ss >> newInfo.ip >> newInfo.port;

	return 0;
}

結果は次のとおりです。

ここに画像の説明を挿入


読んでくれてありがとう、間違いがあれば批判して訂正してください

おすすめ

転載: blog.csdn.net/weixin_51983604/article/details/124293916