1

各文字が 1 バイトを表すテキスト ファイルに文字を pwrite() する必要があります。また、テキスト ファイルに整数を書き込む必要があるため、12 も 2 バイトではなく 1 バイトにする必要があります (2 文字ではありますが)。

文字と整数に char *pointer を使用していますが、テキストの塗りつぶしが整数 (@、逆さまの ? など) の乱雑な値を出力するため、行き詰まります。pwrite() ポインター [ 0] = 105; 105 は、text.txt ファイルの 'i' を変換します (そして、pread() は 'i' として読み取ります)。どういうわけか、105 は変換で失われます。

pwrite()/pread() を正しく行う方法はありますか?

ofstream file; file.open("text.txt");
char *characters = new char;
characters[0] = 105;
cout << pwrite(3, characters, 1, 0);

また、3 は filedes だと思います:-P 実際に見つける方法がわかりません。text.txt ファイルには 'i' が含まれています (ASCII 105 と仮定しています)。次に pread() を実行すると、それが最初に 'i' だったのか 105 だったのか、どうすればわかりますか?

4

1 に答える 1

1

これをチャンクに分割します:

「各文字が 1 バイトを表すテキスト ファイルに文字を pwrite() する必要があります」

定義上、各ASCI 文字 1 バイトであり、ロケール対応のマルチバイト文字、または Unicode の派生物を記述する必要性について言及していないため、これについてはおそらくカバーされていると考えています。

「また、テキスト ファイルに整数を書き込む必要があるため、12 も 2 バイトではなく 1 バイトにする必要があります (2 文字であっても)」

整数データのバイナリ書き込みについて説明しています。ただし、数値表現としての「整数」は、「1 バイト」で表される数値よりも大きくなる可能性があることに注意してください。1 バイトで表現できる整数を書きたい場合は、次のオプションがあります

  1. 符号付きデータの場合、値の範囲は [-128,127] です。
  2. 符号なしデータの場合、値の範囲は [0, 255] です。

これらは、単一オクテットの整数値の制限です。

「文字と整数に char *pointer を使用していますが、テキストの塗りつぶしが整数 (@、逆さまの ? など) の乱雑な値を出力するため、スタックしています。」

前に説明した文字の char ポインターであり、おそらく問題ありません。整数はありません。説明による結果のファイルは、文字通りの意味での「テキスト」ファイルにはなりません。文字データ (char バッファー) とバイナリ データ (整数) の両方が含まれます。値が 0x01 の 1 バイト内の整数は、最初のビットが設定された 1 オクテットであることに注意してください。ASCI文字「1」を表すバイトの値は 0x31 になります ( ASCI チャートを参照))、および EBCDIC の場合は値 0xF1 (確認しないでください)。あなたの例を使用すると、**値12を1バイトに書き込んで、ファイルに表示可能な「テキスト」(文字)データにすることはできません。1 バイト整数値 12 は、ファイル内で 1 バイト値 0x0C として表されます。これを「テキスト」として表示しようとしてもうまくいきません。印刷可能な ASCI ではありません。実際、0x0C の ASCI 値は、フォーム フィード制御文字です。

要するに、ASCI 文字と整数バイトの違いがわからない場合、どのようにpwrite()機能するかを説明してもほとんど役に立たず、さらに混乱することになります。

「私が pwrite() pointer[0] = 105 のときのように; 105 は text.txt ファイルの 'i' を変換します (そして pread() は 'i' として読み取ります) どういうわけか 105 は変換で失われます」

この回答のいくつかの場所にリンクされている ASCI チャートを参照してください。バイト値 105 は、実際には文字「i」の ASCI 値です。105 は失われていません。それが表す文字として表示されます。

最後に、pwrite()Linux、BSD、およびそれを公開することを選択した他の人のための POSIX システム コールです。これは、C または C++ 標準の一部ではありません。つまり、 の最初の引数はpwrite()、システム コールから取得する必要がありますopen()。サポートされている API を使用しない限り、別の API 呼び出しによって開かれると想定されるファイル記述子にピギーバックしないでください。この質問のコードはそうではありません。

于 2012-11-25T04:50:31.720 に答える