8

ファイルを操作するプログラムをデバッグしようとしています。たとえば、ファイル ポインターをオフセット 4 (基数 0 を使用) に設定しましたが、代わりにオフセット 5 から開始しているようです。

何が起こっているのかを把握するために、現在のファイル ポインターを出力する行を追加します (この小さなプロジェクトでは IDE を使用せず、Notepad2 とコマンド ラインのみを使用します)。残念ながら、現在のファイル ポインターを取得するための Windows API 関数はないようです。それを設定するための関数は 1 つだけです。

Pascal (DOS) で現在のファイル ポインターを見つけることができたのを思い出しましたが、Windows の C++ で現在のファイル ポインターを特定するにはどうすればよいでしょうか?

4

1 に答える 1

19

(読み書きの意味で) ゲッターとセッターの両方を提供するほとんどの関数とは異なり、実際にはGetFilePointerorはありませんGetFilePointerEx

ただし、値はを呼び出すことで取得できます。2 つの関数は からの戻り値/出力を返しますが、のオフセットをモードとして指定する必要があります。そうすれば、現在の場所から 0 バイト移動してから戻ります (ゼロ移動を実行するために CPU サイクルと RAM を浪費するかどうかは保証できませんが、そうしないように最適化されていると思います)。SetFilePointer(Ex)SetFilePointerSetFilePointer0 FILE_CURRENT

はい、一貫性がなく混乱を招きます (そして冗長で設計が不十分です) が、独自のGetFilePointer(Ex)関数でラップすることができます。

DWORD    GetFilePointer   (HANDLE hFile) {
    return SetFilePointer(hFile, 0, NULL, FILE_CURRENT);
}


LONGLONG GetFilePointerEx (HANDLE hFile) {
    LARGE_INTEGER liOfs={0};
    LARGE_INTEGER liNew={0};
    SetFilePointerEx(hFile, liOfs, &liNew, FILE_CURRENT);
    return liNew.QuadPart;
}
于 2013-07-17T18:05:24.810 に答える