VB6ではFileSystemObjectでFileオブジェクトを生成して、
Sizeプロパティからファイルサイズ(バイト)を取得出来ますが、
単純にシーケンシャル入力モードで開いたファイルから、
各行を読み込み、その行の文字列のバイト数を都度加算して行けば
最終的なファイルサイズ(バイト)が取得出来ると考えたのですが、
実際同じ値になりません。
例えば、Sizeプロパティでは、35023バイトのファイルが、
文字列のバイト数を「LenB」で都度加算した場合、
Line Input文で38726バイト、Input文では19363バイトになります。
文字列のバイト数を「Len」で都度加算した場合、
Line Input文で19363バイト、Input文では19361バイトになります。
ファイルは単なるテキストデータです。
なぜ差が出るかの原因を御存知の方教えて頂けませんか?
また同じ値になる方法はあるのでしょうか?
よろしくお願いします。
No.2ベストアンサー
- 回答日時:
そのファイルの中身が漢字混じりのテキストファイルなのではありませんか
VBの内部では漢字など文字列はUnicodeに置き換わります
つまり『abcdef』といった半角英数の文字もUnicodeになります
Shift-JISの場合上記の『abcdef』のLenBは5を返します
Unicodeの場合には10を返します
Shift-JISの場合メモリー上には 41 42 43 44 45 といった並びになります
Unicodeの場合メモリー上には 41 00 42 00 43 00 44 00 45 00 といった並びになります
LenとLenBの違いですが半角英数のみならLenはUnicodeでもShift-JISでも同じ値になります
漢字入ってくるとLenは違う値を返します
Shift-JISの場合『あなたのName』の場合12、Unicodeの場合8になります
つまりUnicodeでのLenは1文字が何個あるかを数えます
おやりになりたいことは
ファイルシステム上のデータの持ち方とVB内部でのデータの持ち方を同一になるようにしてカウントしましょう
Shift-JISのファイルであるなら
dim ss as String
dim buf() as Byte
dim nLen as Long
Open "ファイル名" for Input as #1
do until eof
' Line Input でつぶされた CRLF分を+2
if nLen > 0 then nLen = nLen + 2
Line Input #1, ss
buf = strconv( ss, vbFromUnicode )
' Byte配列は0ベースなので + 1する
nLen = nLen + Ubound(buf) + 1
loop
close
といった具合でやってみましょう
No.1
- 回答日時:
LenBは半角なら1、全角なら2が返ると思っているのでは?
LenBは内部形式、即ち、UniCodeのバイト数が返ります。つまり、
いずれも2が返ります。Lenは文字数が返りますので、いずれの
関数の戻り値を累積してもファイルのバイト数にはなりません。
但し、ファイルがUniCodeテキストで、改行が無い時は別です。
次に、Line Input文では復帰+改行が入ってきませんので、
1行毎に2バイトのズレが生じます。Input文では区切り文字や
引用符もとれてしまうので、更に乖離が大きくなります。
ファイルサイズを得るにはFileLen関数、またはLOF関数を使います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascriptのちょっとした動作不良(原因は突き止めたのですが) 1 2023/06/15 19:58
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- JavaScript clear機能を失わずにファイルアップロード機能を作成したい 3 2023/06/10 16:12
- その他(プログラミング・Web制作) プログラミング python pandas 固定長データの出力 2 2022/08/16 11:22
- Excel(エクセル) 配列操作について 5 2023/04/18 07:27
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# 至急お願いします。C言語で.imgのファイルを読み込んで1バイトづつ出力するプログラムを作りたいので 3 2023/01/16 22:49
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
VB6.0でのバイナリデータの扱いについて
Visual Basic(VBA)
-
VB6.0 ファイルの一括読込み
Visual Basic(VBA)
-
SHELLコマンドがうまく動かないです VB6.0
Visual Basic(VBA)
-
-
4
VB6.0-整数と余りを求める
Visual Basic(VBA)
-
5
0バイトのテキストファイル
Visual Basic(VBA)
-
6
VB6のwinsockでconnectできない
Visual Basic(VBA)
-
7
VB6のメモリ解放に関して
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
UTF-8で5~6バイトになる文字コ...
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
10Mバイトて文字数に すると何...
-
char str[256]の256の意味は?
-
ビットスワップとバイトスワッ...
-
バイト列とバイナリ列の違いが...
-
SQLで1バイト、2バイト混在...
-
URLは最高何文字まで可能なので...
-
Javaで日本語1文字のバイト数
-
java6で4バイトUTF-8文字を利用...
-
1KBが1024byteな理由
-
EUCのダブルバイト文字の判定
-
バイナリとBCDコード
-
C言語において2バイト文字を検...
-
UCS-2の一覧表が欲しい
-
:(コロン)のKeyCode
-
CHAR_BITについて
-
Excel VBA で Oracle CLOB型カ...
-
memcmp バイナリデータの比較方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10Mバイトて文字数に すると何...
-
UTF-8で5~6バイトになる文字コ...
-
char str[256]の256の意味は?
-
エクセルシート名の制限を変更...
-
COBOLのCOMP形式について
-
「1TB」のHDDに日本語は何字入...
-
バイナリとBCDコード
-
ビットスワップとバイトスワッ...
-
ピクセル,dpiから容量(バイト...
-
バイト列とバイナリ列の違いが...
-
SQLで1バイト、2バイト混在...
-
【VB2005】テキストボックス内...
-
Javaで日本語1文字のバイト数
-
1KBが1024byteな理由
-
3バイト文字(UTF-8)をprintfで...
-
C++ Builderで文字列をバイトに...
-
文字コードの利点・欠点について
-
半角、全角の判別方法
-
機種依存文字をチェックしたい。
-
64bit対応
おすすめ情報