■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
|
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(1(左):あまり役立たない - 5(右):大変役立った): |
■ ページの共有: |
[ サイト内検索 ]
![]()
カスタム検索
|
#1411-0OpenステートメントとInput関数についてたくちゃん1999-09-09(木) 13:31
#1413-0RE#1411:OpenステートメントとInput関数について匿名14131999-09-09(木) 14:26
#1425-0原因の報告:EOF関数たくちゃん1999-09-09(木) 20:28
#1427-0RE#1425:原因の報告:EOF関数せつら1999-09-09(木) 22:27
#1429-0RE#1427:原因の報告:EOF関数たくちゃん1999-09-09(木) 23:50
#1413-0RE#1411:OpenステートメントとInput関数について匿名14131999-09-09(木) 14:26
#1425-0原因の報告:EOF関数たくちゃん1999-09-09(木) 20:28
#1427-0RE#1425:原因の報告:EOF関数せつら1999-09-09(木) 22:27
#1429-0RE#1427:原因の報告:EOF関数たくちゃん1999-09-09(木) 23:50
たくちゃん1999-09-09(木) 13:31
とあるテキストファイルを開き、1行づつ取得して、 行の先頭に*がある行に対してある処理をしようとしています。 ですが、ファイルがEOFに達していないのに、 EOF関数がTrueを返す事があります。 そこで、EOFの変わりにLOC関数とLOF関数を用いてみましたが、 やはりファイルの途中で「データがもうありません」とエラーメッセージが返ってきました。 原因と対策を知っている方がいましたら、教えて頂けないでしょうか? 以下は、EOFを使ったコードです。 Open strPathAlf For Input Access Read As #1 Do While Not EOF(1) Line Input #1, strAlfFile If Left$(strAlfFile, 1) = "*" Then (いろいろな処理) End If End If Loop Close #1
匿名14131999-09-09(木) 14:26
> ですが、ファイルがEOFに達していないのに、 > EOF関数がTrueを返す事があります。 そんなことがあるのですか? であれば大変です、これまでにたくさん使ってきましたから。 > 原因と対策を知っている方がいましたら、教えて頂けないでしょうか? EOFに達していないということを、どのようにして確認されましたか? Line Input で取得する1行というのは、改行までを1行といいますが、 1行ごとに改行が入っていますか?
たくちゃん1999-09-09(木) 20:28
> > ですが、ファイルがEOFに達していないのに、 > > EOF関数がTrueを返す事があります。 > そんなことがあるのですか? > であれば大変です、これまでにたくさん使ってきましたから。 > Line Input で取得する1行というのは、改行までを1行といいますが、 > 1行ごとに改行が入っていますか? 改行は入っています。 > > 原因と対策を知っている方がいましたら、教えて頂けないでしょうか? > EOFに達していないということを、どのようにして確認されましたか? そのファイルは(10M以上のテキストファイル)は40000行以上あるのですが、 処理に掛かる時間がやたら早かったので、 不思議に思い、LONG型の変数をカウンタとして用意して Line Inputで1行取得するたびにインクリメントしてみました。 そうすると、カウンタが424のところでEOFの戻り値がTrueを返しました。 別のファイル(これも10M以上)で試してみたところ、 処理完了後、カウンタは行数と同じ値を返しました。 【原因】 いろいろと調べてみたところ、 EOFがTrueを返した行に"1A"(EOF)がありました。 Openステートメントで開いて時点で、 この"1A"までしか取得していなかったのだと思います。 このファイルはファイル内にいくつも"1A"がありました。 日本語が化けて"1A"ができたみたいです。 【対策は…?】 ファイル内に"1A"が存在する以上、 それ以降のデータは取得できないのでしょうか? 今度は、Binaryモードで開いて試してみます。
せつら1999-09-09(木) 22:27
ありゃ、自己解決してしまいましたね。 遅かったか〜。 VB自身でシーケンシャルアクセスして作成したファイルならば、&h1A の EOF コードは入らないの ですが、市販のエディタの中には、ファイル末に EOF を付加してくれるものもあるのです。 DOS の頃は EOF コードは有効だったのですけどねぇ。 つまり、こういうエディタで保存した事のあるファイルに Append している場合等には、VB では EOF コードまでしか見れないのです。 バイナリアクセスなら大丈夫ですが、1行ずつ読むという 訳には行かないので、読み方を工夫するか、一旦 EOF コードを削除してしまいましょう。 例えば、一旦ファイルをブロック読み(ある程度大きいサイズです)しながら、EOF コードを探し、 見つかったら置換してしまうのです。 ブロック読みするロジックが面倒ならば、もの凄く遅く なりますが、1バイトずつ読込んで判断する事です。
たくちゃん1999-09-09(木) 23:50
> つまり、こういうエディタで保存した事のあるファイルに Append している場合等には、VB では > EOF コードまでしか見れないのです。 バイナリアクセスなら大丈夫ですが、1行ずつ読むという > 訳には行かないので、読み方を工夫するか、一旦 EOF コードを削除してしまいましょう。 BinaryモードでOpenして、Line Inputで1行ずつ読みこめました。 でも、かなり遅かったです。(8分くらいかかった。(爆)) > 例えば、一旦ファイルをブロック読み(ある程度大きいサイズです)しながら、EOF コードを探し、 > 見つかったら置換してしまうのです。 ブロック読みするロジックが面倒ならば、もの凄く遅く > なりますが、1バイトずつ読込んで判断する事です。 なるほど。φ(..)メモメモ どうもありがとうございました。
このページと関連する記事:
#21351-0読み出しの時間2001-06-14(木) 07:00#3643-0Inputモードで開いているファイルの現読みこみ位置の取得1999-08-22(日) 13:20
#46642-0ファイルの行数カウント2001-09-07(金) 11:56
#3042-0改行コードの変換1999-08-11(水) 11:10
#17762-0テキストファイルの最終行を読み込みたいのですが。2001-09-13(木) 19:02
#1506-050万行のテキストファイルオープンで固まる2005-03-28(月) 18:12
#6184-0RE#6180:openステートメント2000-01-05(水) 14:00
#1635-2シーケンシャルファイルの行の最後の検出方法をおしえて下さい。2002-07-12(金) 05:49
#8317-01行単位のファイル内容の取得について2000-03-07(火) 22:55
#29900-0読み込みファイルと書き出しファイルのサイズ違いについて2002-07-09(火) 12:10
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。