0

を回避するために、fstream出力バッファに直接書き込もうとしていmemcpyます。

次のコードが機能しないのはなぜですか?

Linux上で適切な長さの出力ファイルをコンパイル、実行、生成します。ただし、出力ファイルには正しいテキストが含まれていません。また、何らかの理由で、を含む2行をコメントアウトすると、str2長さがゼロの出力ファイルが生成されることに注意してください。

注:この例は回避しませんmemcpyが、機能する場合は、アプリケーションでを回避するのに役立ちmemcpyます。

#include <fstream>

int main(int argc, char *argv[]) {
  std::fstream out;
  char buffer[512];
  out.rdbuf()->pubsetbuf(buffer, 512);
  out.open("file.txt", std::fstream::out);
  char *str1 = "test text.";
  strcpy(buffer, str1);
  out.rdbuf()->pubseekpos(strlen(str1), std::ios_base::out);
  char *str2 = "why?";
  out << str2;
  out.flush();
  out.close();
}
4

5 に答える 5

2

ストリームに内部使用のためのバッファを与えます。それからあなたはそれに書くために何も与えません。

ストリームに通知せずに何かをバッファにコピーしても、ファイルには何もありません。

お気づきかもしれませんが、seekpos はファイル内での位置決め用であり、バッファ内での移動用ではありません。バッファはストリームの内部使用専用です!

于 2011-04-27T06:29:16.487 に答える
1

の場合out.rdbuf()->pubseekpos(strlen(str1), std::ios_base::out);、これはストリームに新しく作成されたファイルをスキップするように要求します。指定したバッファからデータを取得することを期待できますか?手がかり:何らかの方法でバッファを初期化する必要がある、またはバッファに含まれるガベージ以外の文字の初期数を指定する必要があるというバッファを指定する例を見たことがありますか?いいえ...ストリーム自体がバッファのどの部分が使用されているかを追跡するためです。したがって、推定される空のバッファを取得して前方にスキップすると、間にあるNULが生成されます。それらをバッファに設定することは意味がありません(したがって、単にmemcpyアフターを実行しても機能しpubseekposません)-バッファサイズを超えて前方にジャンプした場合はどうなりますか?

うまくいけば、これが少なくとも問題を説明するのに役立つことを願っていますが、この段階では、ストリームに意味のあるバッファコンテンツの「追跡」を変更させる方法については何も考えていません。

于 2011-04-27T06:08:01.370 に答える
0

まだ早いけど基本的にはやってるんじゃない?

#include <fstream>

int main(int argc, char *argv[]) 
{

  std::fstream out;
  out.open("file.txt", std::fstream::out);

  out << "test text";
  out << "why?";

  out.flush();
  out.close();
}

?

于 2011-04-27T04:39:32.883 に答える
0

3つの可能性が見えます

  1. 独自のストリーム バッファ クラスを実装する
  2. ネイティブ ファイル API を使用する
  3. バッファリングを無効にするpubsetbuf(0, 0)

ストリーム バッファの実装はそれほど難しくなく、パフォーマンスを犠牲にすることなく、C++ スタイルのストリーム挿入と直接メモリ アクセスを組み合わせることができます。

于 2011-04-27T21:10:55.857 に答える
0

私はあなたのプログラムの何が問題なのかを言うほど C++ iostream ライブラリに精通していません。独自のバッファリングを行いたい場合は、read() および write() インターフェイスを使用する方が簡単である可能性が高いことだけを述べておきます。直接(man 2書き込み)。独自のバッファリングを行っている場合、iostream ライブラリはおそらくあまり役​​に立たず、実際に何が起こっているのかを不明瞭にするだけです。

于 2011-04-27T06:04:55.537 に答える