VC++初心者です。
char buff[4096];
DWORD dwBytesRead;
do
{
ReadFile(hFile, buff, 4096, &dwBytesRead, NULL);
} while (dwBytesRead == 4096);
printf(buff);
上記のように、テキストファイルから読み込んだデータを確認したかったですが、
なんとフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
フフフフフのようになっています。
それはなぜですか?
ご教授のほどよろしくお願いいたします。
- 読み込み対象であるテキストファイルのサイズは4096以上ですか?
- ファイルオープンはちゃんとできていますか?
- '読み込んだ大きさが4096である間'読み込みを繰り返す のでいいのですね?
ファイルのオープンはちゃんとできています。
ただし、ファイルのサイズは4096バイト未満です。
επιστημηさん
- '読み込んだ大きさが4096である間'読み込みを繰り返す のでいいのですね?”
意味がよくわからないですが、いったいどうすればいいですか?
え? あなたの呈示したコードがそうなっていますけど。
>- '読み込んだ大きさが4096である間'読み込みを繰り返す のでいいのですね?”
>意味がよくわからないですが、いったいどうすればいいですか?
>do
>{
> ReadFile(hFile, buff, 4096, &dwBytesRead, NULL);
>} while (dwBytesRead == 4096); // <= 読み込んだ大きさが4096である間'読み込みを
繰り返す
自分の書いたプログラムのことですよ~
でも、取得した内容が化けています。
全部フフフフフフフフフフフフフフフフフフフフフフフフフになっていますが。
ReadFile()が失敗しているンじゃないですか?
戻り値確認してGetLastError()で調べてみてはどうでしょうか?
読み込んだ文字列にNULL終端がついておらず、
printf(buff);
で文字列より後ろのメモリ内容が大量に表示されていると予想。
// foo.cpp 己自身を読む
#include <windows.h>
#include <iostream>
#include <cassert>
int main() {
HANDLE hFile = CreateFile(foo.cpp, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
assert( hFile != INVALID_HANDLE_VALUE );
char buffer[4096];
DWORD readSize;
BOOL result = ReadFile(hFile, buffer, 4096, &readSize, NULL);
assert ( result );
buffer[readSize] = '\0';
std::cout << buffer << std::endl;
return 0;
}
ちゃんと読めるんだけどなぁ……
っと失礼、CloseHandle(hFile); を忘れてます。
# この際関係ないけど (^^
確かに、ReadFileが失敗しました。
GetLastError()で取得したエラーコードは5です。
まだわかりませんが、調べます。
ありがとうございました。
επιστημηさんのプログラムをそっくりそのままコピーしても
失敗するんですか??
> GetLastError()で取得したエラーコードは5です。
FormatMessage() を通すと アクセスが拒否されました。 と出ました。
もしかして CreateFile() の時点で失敗してませんか?
たとえば指定パスにファイルが無いとか。。。
絶対パスで書いていて '\\' でなく '\' とか。。。
最初のソースだと CreateFile() 無いからそのせいとか。。。
> 全部フフフフフフフフフフフフフフフフフフフフフフフフフになっていますが。
debug ビルドだと 0xcc(半角カナのフ) で初期化されたんだっけか?
ファイルを読めてないからフが表示されるのでしょう。
蛇足
memset(buff,0,4096);
とすればフフフフ・・・は出なくなります。
> 確かに、ReadFileが失敗しました。
げ。 なんじゃそりゃ。
'読み込んだデータを確認したかった' とかいいつつ、まだ読んでもいないのね…