web-dev-qa-db-ja.com

STL C ++文字列を読み書きする方法は?

#include<string>
...
string in;

//How do I store a string from stdin to in?
//
//gets(in) - 16 cannot convert `std::string' to `char*' for argument `1' to 
//char* gets (char*)' 
//
//scanf("%s",in) also gives some weird error

同様に、inをstdoutまたはファイルに書き出すにはどうすればよいですか?

18
Moeb

CスタイルのI/OとC++タイプを混在させようとしています。 C++を使用する場合は、コンソールの入力と出力にstd :: cinストリームとstd :: coutストリームを使用する必要があります。

#include<string>
#include<iostream>
...
std::string in;
std::string out("hello world");

std::cin >> in;
std::cout << out;

ただし、文字列を読み取る場合、std :: cinは、スペースまたは改行に遭遇するとすぐに読み取りを停止します。 getlineを使用して、コンソールから入力の行全体を取得することをお勧めします。

std::getline(std::cin, in);

ファイルに対して同じ方法を使用します(非バイナリデータを処理する場合)。

std::ofstream ofs('myfile.txt');

ofs << myString;
28
Yacoby

Stdinから_std::string_にテキストを読み取る方法はたくさんあります。ただし、_std::string_ sについては、必要に応じて成長するため、再割り当てされます。内部的には、_std::string_には固定長バッファーへのポインターがあります。バッファがいっぱいで、1つ以上の文字を追加するように要求すると、_std::string_オブジェクトは、古いバッファの代わりに新しい、より大きなバッファを作成し、すべてのテキストを新しいバッファに移動します。

つまり、これから読むテキストの長さがわかっている場合は、これらの再割り当てを回避することでパフォーマンスを向上させることができます。

_#include <iostream>
#include <string>
#include <streambuf>
using namespace std;

// ...
    // if you don't know the length of string ahead of time:
    string in(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());

    // if you do know the length of string:
    in.reserve(TEXT_LENGTH);
    in.assign(istreambuf_iterator<char>(cin), istreambuf_iterator<char>());

    // alternatively (include <algorithm> for this):
    copy(istreambuf_iterator<char>(cin), istreambuf_iterator<char>(),
         back_inserter(in));
_

上記のすべては、ファイルの終わりまで、stdinで見つかったすべてのテキストをコピーします。 1行だけが必要な場合は、std::getline()を使用します。

_#include <string>
#include <iostream>

// ...
    string in;
    while( getline(cin, in) ) {
        // ...
    }
_

単一の文字が必要な場合は、std::istream::get()を使用します。

_#include <iostream>

// ...
    char ch;
    while( cin.get(ch) ) {
        // ...
    }
_
4
wilhelmtell

C++文字列は、_>>_および_<<_演算子、およびその他の同等のC++演算子を使用して読み書きする必要があります。ただし、Cのようにscanfを使用する場合は、いつでもC++の方法で文字列を読み取り、sscanfを使用できます。

_std::string s;
std::getline(cin, s);
sscanf(s.c_str(), "%i%i%c", ...);
_

文字列を出力する最も簡単な方法は次のとおりです。

_s = "string...";
cout << s;
_

ただし、printfも機能します:[fixed printf]

_printf("%s", s.c_str());
_

メソッドc_str()は、nullで終了するASCII文字列へのポインタを返します。これは、すべての標準C関数で使用できます。

1
Michał Trybus