[リストへもどる]
一括表示

投稿時間:2004/02/24(Tue) 02:51
投稿者名:おじん
URL :
タイトル:
バイナリデータの読み書き
サンプルのその2の読み方について、不可解なことが起こりました。一部を掲載します。
>    'ファイルをシーケンシャル入力モードで開く
>    Open strFileName For Input As #intFileNo
>    'バイナリデータとして読込んでUnicodeに変換して表示
>    Text1.Text = StrConv(InputB$(LOF(intFileNo), intFileNo), vbUnicode)
>'    buffer = StrConv(InputB$(LOF(intFileNo), intFileNo), vbUnicode)
>    Close #intFileNo
不思議1:
ファイルの末尾に16進で1Aの文字があると(偶然見つけた)、
「ファイルにこれ以上のデータがありません」というエラーがでる。
不思議2:
上記でコメント行を生かし、その上の行にコメントをいれ、
>'テキストファイルをバイナリモードで書込み
>    Dim testFile$
>    testFile = "f:\test99.txt"
>    intFileNo = FreeFile
>    'ファイルをバイナリモードで開く
>    Open testFile For Binary Access Write As #intFileNo
>        'テキストファイルを丸ごと書込み
>        Put #intFileNo, , buffer 'Text1.Text
>    Close #intFileNo
で書き込むと、ファイルの最初に、16進で、0800 0701 xxxx xxxx〜
(実際には空白はありません。最初の4バイト)
という、どこから来たのか理解できない文字が入ります。なお、0800は
どんな入力ファイルでもこの値になりますが、0701は不定です。そして、
xxxx以降のデータは正規の内容です。読み込んだ直後で、
MsgBox Hex(Asc(Left(buffer,1)))で見ると、正規のデータが表示され
0800(および0701)の値はどこへ行ったのやら見えません。
また、コメントした、Text1(or dim temp$)などを経由するとこの現象は
発生しません。
なお、その1の読み方ではこれらの現象は全く発生しませんでした。

投稿時間:2004/02/24(Tue) 21:06
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: バイナリデータの読み書き
> で書き込むと、ファイルの最初に、16進で、0800 0701 xxxx xxxx〜

たぶん、No.7729 で魔界の仮面弁士さんが書いておられる事ではないでしょうか?

>ファイルの末尾に16進で1Aの文字があると
こちらは、かくにんしておりませんが、最後が LF で終わっていると言う事ですよね。
正常なものには何が最後入っているのでしょうか?正常な場合と比べれば原因が判るのでは
どのような場合そのファイルが作成されるのでしょうか?

投稿時間:2004/02/25(Wed) 01:57
投稿者名:おじん
URL :
タイトル:
Re^2: バイナリデータの読み書き
> > で書き込むと、ファイルの最初に、16進で、0800 0701 xxxx xxxx〜
>
> たぶん、No.7729 で魔界の仮面弁士さんが書いておられる事ではないでしょうか?
>
「識別用文字」ということで理解できます。しかし今回使用したファイルの文字数は267文字
で、08 00 07 01 のそれを解読することができませんでした。
これまで少しは識別用文字をみてきましたが、関数にもあるとは勉強になりました。おじんの
知っていたのは、数字でのプラマイ、comp形式、通信関係のものなどでした。
蛇足ですが、あるフリーの「テキストエディタ」でこのファイルを開くと、カーソルは動かせ
ますが、編集(キー入力)が全く出来ません。頭の08を削除すると可となります。

> >ファイルの末尾に16進で1Aの文字があると
> こちらは、かくにんしておりませんが、最後が LF で終わっていると言う事ですよね。
ではありません。「16進数の1A」です。asciiコード表で見るとBSとありました。

> 正常なものには何が最後入っているのでしょうか?正常な場合と比べれば原因が判るのでは
> どのような場合そのファイルが作成されるのでしょうか?
テストに使用したファイルは、CRLFあり、なし、そして1Aの3種類です。この1Aのものは
別件でファイル操作アプリの途上で作成されたものです(中身は漢字文字で何かゴミがついて
いるぐらいの気付き出、使用に何ら問題はありませんでした。バグです)。
因みに、1Aを2Aに修正すると正常動作します。また、
Text1.Text=読みこみ関数、または
buffer=読みこみ関数:temp$=buffer、のどちらかにすると正常動作します。

また蛇足。これは、以前質問させて頂いた、「ファイルの結合方法」の解決策です。
Dosコマンドの方法は、空白文字を含むフォルダなどの扱いがおじんには上手くできな
かったので、この方法(ファイルを一つずつ後ろに追加していく)に辿りつきました。
結合したいファイルが何十と多くありますので、、、。短いファイル名の取得などでも
試みましたが、、、。

ありがとうございました。また、よろしくお願いいたします。

投稿時間:2004/02/25(Wed) 17:35
投稿者名:GOD
Eメール:
URL :
タイトル:
Re^3: バイナリデータの読み書き
不思議1:
Inputがテキストモードなのでは?

不思議2:
解決済みでいいのかな?
因みに私のところではおきませんでした。
以下、確認したコード:
'テキストファイルをバイナリモードで書込み
    Dim testFile$
    Dim intFileNo As Integer
    Dim buf As String

    testFile = "C:\無題.txt"
    intFileNo = FreeFile

    Open testFile For Input As #intFileNo
    'バイナリデータとして読込んでUnicodeに変換して表示
        buf = StrConv(InputB$(LOF(intFileNo), intFileNo), vbUnicode)
    Close #intFileNo

    'ファイルをバイナリモードで開く
    Open testFile For Binary Access Write As #intFileNo
        'テキストファイルを丸ごと書込み
        Put #intFileNo, , buf
    Close #intFileNo

投稿時間:2004/02/26(Thu) 06:09
投稿者名:おじん
URL :
タイトル:
Re^4: バイナリデータの読み書き
GODさま、ありがとうございます。処理する上では解決しています。ただ、
> 不思議1:
> Inputがテキストモードなのでは?
GODさまが確認されたコードでも(一部変更)、
ファイルの末尾に16進で1Aの文字がファイルを読もうとすると、
「ファイルにこれ以上のデータがありません」というエラーがでます。
色々やっては見ていますが、この理由・原因がまだわかっておりません。
>
また、 不思議2は、変数の型の指定の違いによるもので、このような
読み方の場合(確認したコードの場合も同じ)は、
Variantではなく、Stringにしなければならないということでした。
(TextBoxはString型とみなされる?)

> 以下、確認したコード:
>     Dim buf As String       <---Variantでは不思議2の現象が発生
>
>     testFile = "C:\無題.txt" <===変更
      testFile = "F:\temp.txt" <---16進で1Aをデータ末尾に含むファイル
>
8ビットコードの16進で00から1Fまでは特殊な文字で、それを含むことを知らず
に読み込もうとした間違いでした。
ご迷惑をおかけしましたが、一方、知らなかった新しいことを知ることが出来ました。
ありがとうございました。

投稿時間:2004/02/26(Thu) 09:34
投稿者名:GOD
Eメール:
URL :
タイトル:
Re^5: バイナリデータの読み書き
> > 不思議1:
> > Inputがテキストモードなのでは?
> GODさまが確認されたコードでも(一部変更)、
> ファイルの末尾に16進で1Aの文字がファイルを読もうとすると、
> 「ファイルにこれ以上のデータがありません」というエラーがでます。
> 色々やっては見ていますが、この理由・原因がまだわかっておりません。
>
テキストモードについては下のHPを参考にして下さい。
1Ahは^Z(Ctrl+Z)のことです。
http://www.sixnine.net/cygwin/cygwin-doc/cygwin-ug-net/using-textbinary.html

> また、 不思議2は、変数の型の指定の違いによるもので、このような
> 読み方の場合(確認したコードの場合も同じ)は、
> Variantではなく、Stringにしなければならないということでした。
> (TextBoxはString型とみなされる?)
>
これはヘルプ(Put ステートメント)に書いてある通りです。
ヘルプにはBinaryモードで開いた時の動作が3種類かかれており、「それ以外はRandomアクセスの規則が
適用される。」と明記されています。その中で(Random側)Vartype8・・・とかと書かれている所を読んで
いただければ解決するのではないでしょうか。要はそういう仕様のわけなので...

投稿時間:2004/02/26(Thu) 09:59
投稿者名:おじん
URL :
タイトル:
Re^6: バイナリデータの読み書き
> 要はそういう仕様のわけなので...
GODさま、重ね重ね丁寧なご指導ありがとうございます。
要は、キソ知識ですね。ヘルプもろくに読まずに、おかしいおかしいと
いっているのですから、周りの人は大変です。以後、気をつけます。
参考資料じっくり読んでみます。