テキストファイルの読込み – プログラミング – Home

テキストファイルの読込み
 
通知
すべてクリア

[解決済] テキストファイルの読込み

固定ページ 1 / 2

佐倉
 佐倉
(@佐倉)
ゲスト
結合: 21年前
投稿: 43
Topic starter  

VC++初心者です。
char buff[4096];
DWORD dwBytesRead;
do
{
 ReadFile(hFile, buff, 4096, &dwBytesRead, NULL);
} while (dwBytesRead == 4096);
printf(buff);
上記のように、テキストファイルから読み込んだデータを確認したかったですが、
なんとフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフフ
フフフフフのようになっています。
それはなぜですか?
ご教授のほどよろしくお願いいたします。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

- 読み込み対象であるテキストファイルのサイズは4096以上ですか?
- ファイルオープンはちゃんとできていますか?
- '読み込んだ大きさが4096である間'読み込みを繰り返す のでいいのですね?


返信引用
佐倉
 佐倉
(@佐倉)
ゲスト
結合: 21年前
投稿: 43
Topic starter  

ファイルのオープンはちゃんとできています。
ただし、ファイルのサイズは4096バイト未満です。


返信引用
佐倉
 佐倉
(@佐倉)
ゲスト
結合: 21年前
投稿: 43
Topic starter  

επιστημηさん
- '読み込んだ大きさが4096である間'読み込みを繰り返す のでいいのですね?”
意味がよくわからないですが、いったいどうすればいいですか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

え? あなたの呈示したコードがそうなっていますけど。


返信引用
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

>- '読み込んだ大きさが4096である間'読み込みを繰り返す のでいいのですね?”
>意味がよくわからないですが、いったいどうすればいいですか?
>do
>{
> ReadFile(hFile, buff, 4096, &dwBytesRead, NULL);
>} while (dwBytesRead == 4096); // <= 読み込んだ大きさが4096である間'読み込みを
繰り返す
自分の書いたプログラムのことですよ~


返信引用
佐倉
 佐倉
(@佐倉)
ゲスト
結合: 21年前
投稿: 43
Topic starter  

でも、取得した内容が化けています。
全部フフフフフフフフフフフフフフフフフフフフフフフフフになっていますが。


返信引用
瀬戸っぷ
 瀬戸っぷ
(@瀬戸っぷ)
ゲスト
結合: 22年前
投稿: 160
 

ReadFile()が失敗しているンじゃないですか?
戻り値確認してGetLastError()で調べてみてはどうでしょうか?


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

読み込んだ文字列にNULL終端がついておらず、
printf(buff);
で文字列より後ろのメモリ内容が大量に表示されていると予想。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

// 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;
}

ちゃんと読めるんだけどなぁ……


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

っと失礼、CloseHandle(hFile); を忘れてます。
# この際関係ないけど (^^


返信引用
佐倉
 佐倉
(@佐倉)
ゲスト
結合: 21年前
投稿: 43
Topic starter  

確かに、ReadFileが失敗しました。
GetLastError()で取得したエラーコードは5です。
まだわかりませんが、調べます。
ありがとうございました。


返信引用
Kazuki
 Kazuki
(@Kazuki)
ゲスト
結合: 22年前
投稿: 41
 

επιστημηさんのプログラムをそっくりそのままコピーしても
失敗するんですか??


返信引用
鷲尾不徳
 鷲尾不徳
(@鷲尾不徳)
ゲスト
結合: 21年前
投稿: 21
 

> GetLastError()で取得したエラーコードは5です。
FormatMessage() を通すと アクセスが拒否されました。 と出ました。
もしかして CreateFile() の時点で失敗してませんか?
たとえば指定パスにファイルが無いとか。。。
絶対パスで書いていて '\\' でなく '\' とか。。。
最初のソースだと CreateFile() 無いからそのせいとか。。。

> 全部フフフフフフフフフフフフフフフフフフフフフフフフフになっていますが。
debug ビルドだと 0xcc(半角カナのフ) で初期化されたんだっけか?
ファイルを読めてないからフが表示されるのでしょう。

蛇足
memset(buff,0,4096);
とすればフフフフ・・・は出なくなります。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

> 確かに、ReadFileが失敗しました。

げ。 なんじゃそりゃ。
'読み込んだデータを確認したかった' とかいいつつ、まだ読んでもいないのね…


返信引用
固定ページ 1 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました