0

私は宣言しました

char body[1000] ;
HANDLE myFile;

ファイルを作成してタイトルを書き込む前のセクションが既にあります。よく書けます。

ループなしで次のコマンドがあります。

HANDLE myFile=CreateFile("filename.txt",GENERIC_ALL,FILE_SHARE_WRITE,0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
char* HeadingStr="a1 a2 a3 a4 a5 a6 a7 a8 \n";
WriteFile(myFile,HeadingStr,lstrlen(HeadingStr),0,NULL);
CloseHandle(myFile);

次に、次のコードがあります

loop{ (100 times)

myFile=CreateFile("filename.txt",FILE_APPEND_DATA,FILE_SHARE_WRITE,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
BufferNo=sprintf(body,"%f %f %f %f %f %f %f %f \n",a1,a2,a3,a4,a5,a6,a7,a8);
WriteFile(myFile,body,BufferNo,0,NULL);
CloseHandle(myFile);

}

ループは、実際にはデバイスから受信しているメッセージです。したがって、これに対して何もする必要はありません。

コードを実行すると、エラー Access Violation Error が表示され、

WriteFile(myFile,body,BufferNo,0,NULL);

ファイルをチェックすると、

a1 a2 a3 a4 a5 a6 a7 a8 (rectangle: may be way of text editor saying line break) and then 2 4 23 21 12 431 23 32 (same rectangle)

これですべてです。このエラーは、これがデバイスからのメッセージによるものではないことを示しています。さらに詳細が必要な場合は、お知らせください。ここのどこにエラーがありますか?

PS私はこれの前に質問をしました。このエラーが発生する前にエラーが含まれており、その問題の解決策も含まれていました。そこで質問しましたが、活動がなかったので再度質問します。しかし、問題は異なります。

4

2 に答える 2

1

WriteFile プロトタイプ:

BOOL WINAPI WriteFile(
  _In_         HANDLE hFile,
  _In_         LPCVOID lpBuffer,
  _In_         DWORD nNumberOfBytesToWrite,
  _Out_opt_    LPDWORD lpNumberOfBytesWritten,
  _Inout_opt_  LPOVERLAPPED lpOverlapped
);

lpNumberOfBytesWrittenlpOverlappedの両方にすることはできませんNULL。while isを渡し0ているため、アドレス location に書き込もうとしているため、例外が発生します。lpNumberOfBytesWrittenlpOverlappedNULL0

ダミー変数を与えます。

...
DWORD dummy = 0;
WriteFile(myFile,body,BufferNo,&dummy,NULL);
...

CreateFile(...)また、 andをループ ブロックの外に移動するCloseHandle(...)必要があります (ファイルを繰り返し開いたり閉じたりする必要はありません)。

于 2013-07-01T15:56:58.433 に答える
1

関数 WriteFile() のコードを読むのは面白いと思います。

とにかく、実行しようとする種類の計算の通常のアルゴリズムは次のとおりです。

  • ファイルを開く

  • 行を書き込みます (必要に応じてループします)

  • ファイルを閉じる

それ以外の

  • ファイルを開く、書き込む、閉じる

  • ファイルを開く、書き込む、閉じる

  • ...

したがって、ファイルを開くための事前関数を作成し、このアクションを WriteFile() から削除するのが最善だと思います。

于 2013-07-01T15:25:48.817 に答える