■ 現在のこのページの役立ち度:
表示されない場合こちらのリンクからもご覧になれます。
■ このページの役立ち度を評価する:
役立ち度を評価してください。
(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
#1411-0
OpenステートメントとInput関数について
とあるテキストファイルを開き、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
#1413-0
RE#1411:OpenステートメントとInput関数について
> ですが、ファイルがEOFに達していないのに、
> EOF関数がTrueを返す事があります。
  そんなことがあるのですか?
  であれば大変です、これまでにたくさん使ってきましたから。

> 原因と対策を知っている方がいましたら、教えて頂けないでしょうか?
  EOFに達していないということを、どのようにして確認されましたか?
  Line Input で取得する1行というのは、改行までを1行といいますが、
  1行ごとに改行が入っていますか?
#1425-0
原因の報告:EOF関数
> > ですが、ファイルが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モードで開いて試してみます。
#1427-0
RE#1425:原因の報告:EOF関数
ありゃ、自己解決してしまいましたね。 遅かったか〜。

VB自身でシーケンシャルアクセスして作成したファイルならば、&h1A の EOF コードは入らないの
ですが、市販のエディタの中には、ファイル末に EOF を付加してくれるものもあるのです。 DOS
の頃は EOF コードは有効だったのですけどねぇ。

つまり、こういうエディタで保存した事のあるファイルに Append している場合等には、VB では
EOF コードまでしか見れないのです。 バイナリアクセスなら大丈夫ですが、1行ずつ読むという
訳には行かないので、読み方を工夫するか、一旦 EOF コードを削除してしまいましょう。

例えば、一旦ファイルをブロック読み(ある程度大きいサイズです)しながら、EOF コードを探し、
見つかったら置換してしまうのです。 ブロック読みするロジックが面倒ならば、もの凄く遅く
なりますが、1バイトずつ読込んで判断する事です。
#1429-0
RE#1427:原因の報告:EOF関数
> つまり、こういうエディタで保存した事のあるファイルに Append している場合等には、VB では
> EOF コードまでしか見れないのです。 バイナリアクセスなら大丈夫ですが、1行ずつ読むという
> 訳には行かないので、読み方を工夫するか、一旦 EOF コードを削除してしまいましょう。

BinaryモードでOpenして、Line Inputで1行ずつ読みこめました。
でも、かなり遅かったです。(8分くらいかかった。(爆))

> 例えば、一旦ファイルをブロック読み(ある程度大きいサイズです)しながら、EOF コードを探し、
> 見つかったら置換してしまうのです。 ブロック読みするロジックが面倒ならば、もの凄く遅く
> なりますが、1バイトずつ読込んで判断する事です。

なるほど。φ(..)メモメモ
どうもありがとうございました。
お探しの情報は見つかりましたか?お困りの問題は解決しましたか?
サイト内検索, 似た記事検索で見つからなくてもあきらめずに掲示板で質問してみましょう。
VB初心者友の会があなたのお役に立てれば幸いです。また、本ページの投稿者の方々にこの場を借りて感謝致します。
本ページは過去ログを集めて自動構成しています。よろしければこのページに関するフィードバックをお願いします。
(※ 構成の誤り、広告等の不適切な記事、リンク切れ、読めないページの報告など)