2

ファイルを開き、バッファからデータを追加して閉じるだけです。Linuxマシンでその目的のために「オープン」と「書き込み」を使用しています。'write()' の後のリターン コードは正ですが、ファイル サイズは増加せず、常に空です。私は髪を引っ張って、以下のコードの問題を把握しています。いくつかの新鮮な目がいくつかの光を当てることができると思った.

#define BIT_Q_FILE  ".\\bitq.dat"

int BQWrite(void *p)
{
int fd ;
int rc = -1 ;

fd = open(BIT_Q_FILE, O_RDWR | O_APPEND ) ;

if (fd < 0)
    return -1;


memset(&BITQBuff,0,sizeof(typeBITQFile));
memcpy(&BITQBuff.pBitQueue,p,sizeof(typeBITQueue));

rc = write(fd, &BITQBuff,sizeof(typeBITQFile)) ;

close(fd) ;

if(rc!=sizeof(typeBITQFile))
{
    return -1;
}

rc = sizeof(typeBITQueue);

return rc ;
}
4

2 に答える 2

7

私はあなたの問題をここに持っています:

#define BIT_Q_FILE  ".\\bitq.dat"

Windows から Unix への移植の落とし穴を 3 つ見つけました。

  • Unix のディレクトリ セパレータは/ではなく\です。
  • しかし、Unix は\、ファイル名の途中に置くことを完全に喜んで許可します。(パス名コンポーネントに表示できない唯一のバイト (実際には文字ではなくバイトを意味します) は、値が 0x2F と 0x00 のバイトです。)
  • Unix では、ファイル名をドットで開始することも完全に許可されています。ただし、デフォルトlsでは、ドットで始まるファイル名は出力されません。

したがって、現在のディレクトリにある という名前のファイルにデータが書き込まれることを期待していますがbitq.dat、実際には現在のディレクトリにある という名前のファイルに書き込まれています.\bitq.dat。そのファイルはデフォルトで非表示になっているため、データが空中に消えているように見えます。 ls -a隠しファイルを明らかにし、それrm .\\bitq.datを削除します。コードを修正するには、定義を次のように変更するだけです

#define BIT_Q_FILE "bitq.dat"

./に渡されるパスに先頭を付ける必要はありませんopen

これがあなたのコードの唯一の問題ではないかもしれませんが、明らかに間違っているものは他にありません。さらに支援が必要な場合は、自分でコンパイルして実行できる完全最小限のテスト プログラムを含む新しい質問を投稿してください。

于 2012-05-08T19:38:20.743 に答える
4

変更してみてください

#define BIT_Q_FILE  ".\\\bitq.dat"

#define BIT_Q_FILE  "./bitq.dat"
于 2012-05-08T19:35:08.237 に答える