read() に std::string を使用することは可能ですか?
例 :
std::string data;
read(fd, data, 42);
通常、 char* を使用する必要がありますが、 std::string を直接使用することは可能ですか? (結果を保存するために char* を作成しないことをお勧めします)
ありがとう
char*
それは関数が必要とするものなので、どうにかして を作成する必要があります。(ところで: あなたは Posix 関数について話しているの
ですか?) 問題は ではなく、read
が指しているものです (これはあなたが実際に意図したことだと思います)。std::istream::read
char*
char*
ここでの最も簡単で一般的な解決策は、ローカル配列を使用することです。
char buffer[43];
int len = read(fd, buffer, 42);
if ( len < 0 ) {
// read error...
} else if ( len == 0 ) {
// eof...
} else {
std::string data(buffer, len);
}
ただし、に直接キャプチャしたい場合std::string
は、これが可能です (ただし、必ずしも良い考えではありません)。
std::string data;
data.resize( 42 );
int len = read( fd, &data[0], data.size() );
// error handling as above...
data.resize( len ); // If no error...
これによりコピーが回避されますが、率直に言って...実際の読み取りと文字列内のメモリの割り当てに必要な時間と比較すると、コピーは取るに足らないものです。これには、実際に読み取られる文字に必要な最小値ではなく、結果の文字列が 42 バイトの実際のバッファー (切り上げ) を持つという (おそらく無視できる) 欠点もあります。
(また、 のメモリの連続性に関して、人々が時々問題を提起するので、std:;string
これは 10 年以上前の問題でした。 の元の仕様std::string
は、当時人気のあったrope
クラス. 実際には, 実装者はこれが有用であることに気づきませんでした, そして人々は連続性を仮定し始めました. その時点で, 標準化委員会は標準を既存の慣行に合わせて, 連続性を要求することを決定しました. C++11 の要件を考えると、今後の実装では連続性が失われることはありません。)
いいえ、できませんし、すべきではありません。通常、std::string 実装は、割り当てられたメモリのサイズや実際の文字列の長さなどの他の情報を内部的に格納します。C++ のドキュメントには、c_str()
またはによって返される値を変更するdata()
と、未定義の動作が発生することが明示的に記載されています。
いいえ、でも
std::string data;
cin >> data;
うまく動作します。の動作が本当に必要な場合はread(2)
、独自の文字バッファを割り当てて管理する必要があります。
read 関数が char * を必要とする場合は、いいえ。最初にサイズ変更されている限り、char の std::vector の最初の要素のアドレスを使用できます。古い(C++ 11より前の)文字列が連続したメモリを持つことが保証されているとは思いません。そうでなければ、文字列で同様のことを行うことができます。
read() は生データの入力を目的としているため、std::string はテキストを処理するため、実際には悪い選択です。std::vector は、生データを処理するための正しい選択のようです。
文字列ライブラリのstd::getlineを使用すると( cplusplus.comを参照) 、ストリームから読み取り、文字列オブジェクトに直接書き込むことができます。例(再びcplusplus.comからリッピング-getlineのグーグルでの最初のヒット):
int main () {
string str;
cout << "Please enter full name: ";
getline (cin,str);
cout << "Thank you, " << str << ".\n";
}
したがって、stdin(cin)およびファイル(ifstream)から読み取るときに機能します。