#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またはファイルに書き出すにはどうすればよいですか?
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;
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) ) {
// ...
}
_
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関数で使用できます。