1. ホーム
  2. C++

std::cinの使用

2022-02-26 19:26:30
<パス

1. コンセプト

C++の基本的な入出力

C++の標準ライブラリは、豊富な入出力関数を提供しています。ここでは、C++プログラミングで最も基本的で一般的な入出力操作を紹介します。C++の入出力は、バイトのシーケンスであるストリームで行われます。バイトのストリームがデバイス(キーボード、ディスクドライブ、ネットワーク接続など)からメモリに流れる場合、これを「ストリーム」と呼びます。 入力操作 . バイトストリームがメモリからデバイス(ディスプレイ、プリンター、ディスクドライブ、ネットワーク接続など)に流れている場合、これを 出力操作 .

標準出力ストリーム(cout)

coutオブジェクトは、標準出力デバイス(通常はディスプレイ)に接続します。

#include 

 
using namespace std;
 
int main( )
{
   char str[] = "Hello C++";
 
   cout << "Value of str is : " << str << endl;
}


標準入力ストリーム(cin)

定義済みオブジェクト cin は iostream クラスのインスタンスです。cin オブジェクトは標準入力デバイス(通常はキーボード)に接続されます。cin はストリーム抽出演算子 >> と組み合わせて、次のように使用します。

#include 

 
using namespace std;
 
int main( )
{
   char name[50];
 
   cout << "Please enter your name: ";
   cin >> name;
   cout << "Your name is: " << name << endl;
 
}


標準エラーストリーム(cerr)
標準的なログストリーム(clog)

参考 http://www.runoob.com/cplusplus/cpp-basic-input-output.html

2. std::cinの共通読み込みメソッド

2.1 cin>>

使用法1:数字を入力する

#include 

using namespace std;
int main () 
{ 
	int num; 
	cout << "Please enter the number: ";
	cin >> num;
	cout << "The number you entered is: " << num << endl;
}


注意:上記のコードを実行すると、入力が数字以外(例えばa)の場合はcinエラーが発生し、ループで入力した場合はデッドループになります。

使い方2:文字列を受け取り、"space", "TAB" または "enter" で終わらせる。

#include 

using namespace std; 
int main () 
{ 
	char str[64]={0}; 
	cout << "Please enter a string: ";
	cin >> str; 
	cout << "The string you entered is: " << str << endl;
}


<ブロッククオート

入力:テスト
出力:テスト
Enter: test cin //スペースで終了
出力:テスト

注意: >> は見えない文字(スペース、キャリッジリターン、TABなど)をフィルタリングしているので、ホワイトスペースをスキップしたくない場合は、noskipwsストリームコントロールを使ってください: cin>>noskipws>>str; ここで typing: spaces test は、スペースを出力することになります。

2.2 cin.get()

この関数にはいくつかのオーバーロードがあり、4つの形式があります。パラメータなし、1つの引数、2つの引数、3つの引数です。よく使われる関数のプロトタイプは以下の通りである。

int cin.get();
istream& cin.get(char& var);
istream& get ( char* s, streamsize n );
istream& get ( char* s, streamsize n, char delim );


使い方1:cin.getで文字を読み込む

using namespace std;

int main()
{
    char a;
    char b;
    cout << "Please enter two characters: ";
    a=cin.get(); //mode one
    cin.get(b); //mode two
    cout<<"character a:"<<<a<<"\n character b:"<<b<<endl;
    return 0;
}


入力:a [キャリッジリターン]、出力。

注意事項

  1. 結果からわかるように、cin.get()は入力バッファからセパレータを無視して1文字を直接読み込み、上記のような状況を与え、改行文字を変数bに読み込んで出力に2回出力しています。
  2. cin.get() の戻り値は int 型で、成功:文字の ASCII 値が読み込まれ、ファイルの終端文字に遭遇すると EOF すなわち -1 が返されます。cin.get(char var) は成功すると cin オブジェクトを返すので cin.get(b).get© のような連鎖操作をサポートすることができます。

使い方2:cin.getは文字列を読み込み、スペースを取ることができる

#include 

#include 
Input: 123 456 [carriage return], output.


Notes. As you can see from the results, cin.get(array,20); reads a line and ends the read when it encounters a newline character, but does not process the newline character, which remains in the input buffer. The second time cin.get() reads the newline into variable b, it prints the ASCII value of the input newline as 10. This is the difference between reading a line with cin.get() and reading a line with getline. It also removes '\n' directly from the input buffer and does not affect the following input processing. cin.get(str,size); reads a line only into a C-style string, i.e. char*, but C++'s getline function can read a string into a C++-style string, i.e. string type. Given these two advantages of getline over cin.get(), the It is recommended to use getline for line reading. The usage of getline is described below. 2.3 cin.getline() reads a line Function: Reads a string from the standard input device keyboard and terminates it with the specified terminator.
There are two function prototypes. istream& getline(char* s, streamsize count); //default to end with a newline istream& getline(char* s, streamsize count, char delim); Use 1. #include using namespace std; int main() { char array[20]={0}; // cin.getline(array,20); // or specify the terminator, using the following line cin.getline(array,20,'\n'); cout<<array<<endl; return 0; } Note that the difference between cin.getline and cin.get is that cin.getline does not leave terminators or newlines in the input buffer. 3. cin needs to enter numbers when entering letters cin status error Reference.
https://blog.csdn.net/zyb238909/article/details/53056990
https://www.cnblogs.com/tonglingliangyong/p/3908463.html Example. #include #include using namespace std; int main( ) { int num; while(1) { cout << "Please enter the number: "; cin >> num; //When entering letters or . will cause the cin state to fall into a dead loop cout << "The number you entered is: " << num << endl; } return 0; } Note: the above program causes the cin state exception to fall into a dead loop when the letters are entered. Modified as follows.
#include 

#include 

#include 

using namespace std;
 
int main( )
{
    int num;
	while(1)
	{
		cout << "Please enter the number: ";
		cin >> num;
		while (cin.fail())
		{
			cout << "There was an input error! Please retype: ";
			cin.clear();
			//cin.sync(); // not working well here
			cin.ignore(numeric_limits<std::streamsize>::max(),'\n');// clear the current line
			// cin.ignore(numeric_limits
4. cin's conditional state
When using cin to read keyboard input, errors are inevitable, and if an error occurs, cin will set the condition state. The condition state identifier is :

goodbit:no error
eofbit:End of file reached
failbit:non-fatal input/output error, reversible
badbit: fatal input/output error, irreversible
If in the input/output class. The iOS::identifier number needs to be added. Corresponding to these conditional states are the member functions of the stream object that set, read, and determine the conditional state. They are mainly.
s.eof(): returns true if the eofbit of stream s is set.
s.fail(): returns true if the failbit of stream s is set.
s.bad(): returns true if the badbit of stream s is set.
s.good(): returns true if the goodbit of stream s is set.
s.clear(flags): clears the status flag bit and sets the given flag bit flags to 1, returning void.
s.setstate(flags): set the corresponding conditional state position in stream s to 1 based on the given flags conditional state flag bit, returning void.
s.rdstate(): return the current conditional state of stream s, return value type strm::iostate. strm::iostate machine-related plastic name, defined by each iostream class, used to define the conditional state. 5. cin emptying the input buffer cin.clear();
cin.sync();
cin.ignor(); http://blog.sina.com.cn/s/blog_8d3652760100wl9r.html 6. Other ways to read a line of string from standard input 6.1 Reading a line from getline C++ defines a global function getline in the std namespace, which is declared in the < string> header file because it uses the string as an argument. getline uses cin to read a line from the standard input device keyboard, and ends the read operation when it 1) reaches the end of the file, 2) encounters the function's delimiter, or 3) reaches the maximum input limit. The function prototype has two overloaded forms. istream& getline ( istream& is, string& str);//default ends with a line break istream& getline ( istream& is, string& str, char delim); Example usage. #include #include using namespace std; main () { string str; getline(cin,str); cout<<str<<endl; } Note: getline() accepts a string that can take spaces and output them. Note: When getline encounters a terminator, it reads the terminator along with the specified string, and then replaces the terminator with a null character. Therefore, it is safer to use getline when reading a line of characters from the keyboard. However, it is better to perform standard input security checks to improve the program's fault tolerance. cin.getline() is similar, but cin.getline() is part of the istream stream, while getline() is part of the string stream, which are not the same two functions. 6.2 Getting to read a line gets is a library function in C, asserted in < stdio.h>, that reads a string from a standard input device, can read infinitely, does not judge the upper limit, and stops reading at the end of a carriage return or EOF, so the programmer should make sure the buffer is large enough so that no overflow occurs when performing a read operation.
Function prototype. char *gets( char *buffer );
Example usage. #include <iostream> #include <stdio.h> using namespace std; int main() { char array[20]={NULL}; gets(array); cout<<array<<endl; return 0; } Since this function is a C library function, it is not recommended to use it. Since this is a C++ program, try to use C++ library functions. Reference.
https://zh.cppreference.com/w/cpp/io/basic_istream
https://blog.csdn.net/bravedence/article/details/77282039
https://www.cnblogs.com/luolizhi/p/5746775.html
istream& getline(char* s, streamsize count); //default to end with a newline istream& getline(char* s, streamsize count, char delim);