3

ReadFile()WinAPIを呼び出して、ファイルの内容をVC++コード内のchar配列にコピーしています。ReadFile()の直後にGetLastError()を配置しました。

for( read some n no: of files)
{
FileRead(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL);
int ret = GetLastError();
}

GetLastError()は、最初のファイルが読み取られた場合にのみ183を返します。他のすべてのファイルは、返される183を読み取ります。ただし、183が返される場合でも、ファイルの内容はcharArrayにコピーされます。また、問題は、28番目のファイルでファイルの読み取りが行われないことです(ここでも、戻りステータスは183です)。ファイルの読み取りが成功したか失敗したかに関係なく、183が返されます。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681382(v=vs.85).aspxによると

エラーコード183は「ERROR_ALREADY_EXISTS」を意味します。

上記のエラーステータスは、ReadFile()コンテキストで何を意味しますか?

誰かが親切に理由を理解するのを手伝ってくれますか?

4

2 に答える 2

8

コードが誤ってを呼び出していGetLastErrorます。GetLastError直前のWin32API呼び出しが失敗した場合にのみ呼び出す必要があり、そのAPIは。を介してステータス情報を返しますGetLastError

ここで問題のAPIはですReadFileドキュメントには次のように書かれています。

戻り値

関数が成功した場合、戻り値はゼロ以外(TRUE)です。

関数が失敗した場合、または非同期で完了している場合、戻り値はゼロ(FALSE)です。拡張エラー情報を取得するには、GetLastError関数を呼び出します。

ReadFileつまり、を返す場合にのみ呼び出す必要がありますFALSE

コードは次のようになります。

if (!ReadFile(fp,destCharArray,ByesToRead,NoOfBytesRead,NULL))
{
    DWORD err = GetLastError();
    // handle error probably by raising exception
}

あなたのコードは、への呼び出しとは関係のない以前の失敗のエラーコードを返していますReadFile

于 2012-02-03T13:06:06.490 に答える
0

最後のエラーは、事前にCreateFileを呼び出した結果である可能性があります。この関数は、dwCreationDispositionにCREATE_ALWAYSまたはCREATE_NEWを指定した場合、最後のエラー値をERROR_ALREADY_EXISTSに設定します

最後のエラーはどの関数でも設定できることを知っておくことが重要です。関数が失敗したかどうかを示す関数の戻り値を常に確認する必要があります。

于 2012-02-03T12:38:47.043 に答える