6

次のように定義されている文字列のサイズをバイト単位で書き出そうとしています。

#define PATHA "/tmp/matrix_a"

コードを使用する

rtn=write(data,(strlen(PATHA)*sizeof(char)),sizeof(int));
if(rtn < 0) 
    perror("Writing data_file 2 ");

戻ってきますWriting data_file 2 : Bad address

これは正確には悪いアドレスですか?データファイル記述子が開いており、上記のコードセグメントの直前と直後に正しく書き込まれます。ファイルに書き込まれるデータは、dataASCIIではなく生である必要があります。

同じ問題で文字列をchar[]として定義しようとしました

4

5 に答える 5

4

の2番目の引数write()は、書き込みたいバイトのアドレスですが、自分で書き込みたいバイトを渡します。アドレスを取得するには、それらのバイトを変数に格納する必要があります(式の結果のアドレスを取得することはできません)。例えば:

size_t patha_len = strlen(PATHA);

rtn = write(data, &patha_len, sizeof patha_len);
于 2012-12-05T23:48:42.630 に答える
4

POSIXの引数は次のwrite()とおりです。

#include <unistd.h>

ssize_t write(int fildes, const void *buf, size_t nbyte);

それは:

  • ファイル記述子
  • バッファ
  • サイズ

アドレスとサイズの代わりに2つのサイズを渡しました。

使用する:

rtn = write(data, PATHA, sizeof(PATHA)-1);

また:

rtn = write(data, PATHA, strlen(PATHA));

文字列のサイズをとして記述しようとしている場合は、次のように、に渡す変数intが必要です。intwrite()

int len = strlen(PATHA);

rtn = write(data, &len, sizeof(len));

;size_tを記述したい場合を除いて、変数を使用することはできないことに注意してください。size_t特に64ビットUnixシステムではsizeof(size_t) != sizeof(int)、一般的に、書き込むサイズを決定する必要があります。

また、一部のシステムはリトルエンディアンであり、他のシステムはビッグエンディアンであり、一方のタイプでこのメカニズムを使用して記述したものは、もう一方のタイプでは読み取れないことに注意する必要があります(I / Oの前後に行われるマッピング作業なし)。オペレーション)。これを問題として無視するか、ポータブル形式(通常は「ネットワーク順序」と呼ばれ、ビッグエンディアンと同等)を使用するか、コードで反対の形式を使用するように定義するかを選択できます。注文。注意すれば、すべてのプラットフォームで同じロジックが使用されるようにコードを書くことができます(そして、すべてのプラットフォームが同じ答えを得る)。

于 2012-12-05T22:40:15.673 に答える
3

の2番目の引数write()はバッファで、3番目の引数はサイズです。

ssize_t write(int fd, const void *buf, size_t count);

投稿されたコードは、間違ったアドレスとして解釈される長さを渡します。コンパイラーはこれに関する警告を発するはずです(コンパイラーの警告を無視せず、警告レベルを最高レベルにしてコンパイルしてください)。

への変更:

rtn=write(data, PATHA, strlen(PATHA));

サイズ計算から省略できるようにsizeof(char)注意してください。1

于 2012-12-05T22:40:11.270 に答える
2

エラーはBad addressすでに回答済みです。文字列のサイズを記述したい場合は、を使用してprintfください。

printf("Length: %d\n", strlen(data));

それか、整数を文字列に変換して出力する関数を書くことができます...私は好きですprintf:)

于 2012-12-05T23:00:50.483 に答える
1
rtn = write(data, PATHA, strlen(PATHA));

あなたが欲しいものだと思います。引数は

  1. ファイル記述子(データ)
  2. ソースバッファ(文字列定数PATHA)
  3. そのバッファーからプルするバイト数(同じPATHA定数でstrlen()を使用して測定)

また、完全を期すために、あなたは常にあなたが書いた文字数についてrtnをチェックするべきです。すべての記述子タイプで要求されたすべてのバイトをwrite()する保証はありません。そのため、時々、それが書いたと答える量と、まだ書いていないとわかっている数によって決定される、チャンクでそれを書くことになります。

于 2012-12-05T22:45:57.287 に答える