
ファイルを1024バイトずつ読みこみ、その内容をソケットでホストへ送るというアプリがあります。
ファイルを「1024バイト読んで→送信」を繰り返すのですが、ファイルを読みこむところ(Get)で日本語が混じったときにエラーを生じます。
「レコード長が一致しません」というエラーメッセージです。
日本語がはいる桁数だけバイト数は減るためだと思いますが、ランダムアクセスで読みこむと場合の記述の仕方で、何とかならないものかと思案しています。
どなたかご教授ください。よろしくお願いします。
<プログラム記述例>
Dim filenum As Integer
Dim filename As String
Dim buffer As String * 1024
filename = "e:\tmp\file.txt"
filenum = FreeFile
Open filename For Random Access Read As #filenum Len = 1024
Do While Not EOF(filenum)
Get #filenum, , buffer
Loop
Close #filenum
No.4ベストアンサー
- 回答日時:
すいません。
現在VB環境が無いから・・・さっきのバグってます・・・
さっきの誤り部分
buffer = Space(lngLen - 1)
'ファイルをバイト単位ではなく、全部取得
Open filename For Random Access Read As #filenum
Get #filenum, , buffer
Close #filenum
本当は・・・
buffer = Space(lngLen)
'ファイルをバイト単位ではなく、全部取得
Open filename For Binary Access Read As #filenum
Get #filenum, , buffer
Close #filenum
と置き換えたらできると思うのですが・・・
環境が無いので未実行です。
参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=154509
No.5
- 回答日時:
#3の者です。
Input$がシーケンシャル用であるのは知っています。しかしランダムファイルは1連の文字列の
ストリームで、レコードごとのデリミタも無く、第nレコードはp=(nー1)*RecLen+1からRecLenバイトの文字列レコードで、RecLenバイトで、全レコードについて意味が完結しているべきものと思います。質問の中から、RecLenバイトで切ると、意味的に、ちょちょ切れているようであるので、このファイルはランダムファイルとして扱うことが破綻していると言う事ではないでしょうか。私は全角シフトイン・アウトの数がレコードごとに変わり意味的長さが変動するケースを経験したような気がするがそんなケースでしょうか(注)RecLenはレコード長を勝手に私が造語。
No1、No4のTAGOSAKU7さんの一括してBinaryで読みこむ方法でうまくいきました。
読みこんでからは、Strconv(buffer,vbFromUnicode)で Unicode からシステムの既定のコード ページに変換して、LenB(buffer)で長さを調べて、送信データはまた Strconv(buffer,vbUnicode)で Unicode に戻すなど、やっかいでしたがなんとか解決しました。どうもありがとうございます。
No.3
- 回答日時:
ダメの様に思いますが、(VBの2,3の本に記載無し)
旧Dos-BasicのステートメントにはInput$があります。Input$ (<ファイルから読みこむ文字のバイト数を指定> <#とファイル番号>)
VBでも使えないかチェックしてください。当方データが無くチェックできませんので。
どうもありがとうございます。
Input$関数はシーケンシャルモードとバイナリモード用ですので使えませんでした。ランダムアクセスではGet関数以外にないものでしょうか。
No.1
- 回答日時:
バイト数がバラバラなら、ゲットで分割取得の方法は無理ではないかな?
いっそのこと、一行単位で読み込むか、全部読み込むかをした方がいいと思います。
Const DEF_SEND_LEN As Long = 1024
Dim filenum As Integer
Dim filename As String
Dim buffer As String
Dim lngLen As Long
Dim varWk As Variant
Dim strWk As String
Dim i As Long
filename = "e:\tmp\file.txt"
filenum = FreeFile
lngLen = FileLen(filename)
buffer = Space(lngLen - 1)
'ファイルをバイト単位ではなく、全部取得
Open filename For Random Access Read As #filenum
Get #filenum, , buffer
Close #filenum
'配列に分解
'サンプルは改行コードで分解
varWk = Split(buffer, vbCrLf)
'配列ループ
For i = LBound(varWk) To UBound(varWk)
'配列単位で文字列取得
strWk = varWk(i) & Space(DEF_SEND_LEN)
'DEF_SEND_LEN定数バイト数の文字列に変換
strWk = StrConv(LeftB(StrConv(strWk, vbFromUnicode), DEF_SEND_LEN), vbUnicode)
'ここで送信
Next i
TAGOSAKU7さん、お久しぶりです。またいち早く回答をいただき感激です。
早速試してみました。全部読みこむという発想はとても新鮮でした。
しかし、同じエラーでした。ランダムアクセスでは読みこむバイト数をしっかり指定しないとダメなのでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ファイル内の(&H0A)を(&H0D0A)...
-
バイト型のデータを16進表記で...
-
日本語混じりのファイルをラン...
-
エクセルのプロパティーでセキ...
-
パワーポイントの文字数
-
エクセルvbaでdocuworksprinter...
-
エクセルで複数のコメントのサ...
-
動かなくなってしまった古いVBA...
-
ファイルサーバ上のファイルが...
-
frxファイルの役目
-
Excel 相対パス
-
同じファイル名 上書きしないフ...
-
実行ファイルのパスを取得したい
-
ファイル名と同名のフォルダを...
-
エクセルのハイパーリンクがコ...
-
開いているファイルを削除し、...
-
ExcelブックをGoogleスプレッド...
-
カンマ区切りのCSVファイルから...
-
複数のテキストファイル内の複...
-
Excel csv保存 列数が異なる場...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルを後ろから読...
-
DXFファイルをVBで取り込み、図...
-
ファイル入力のデータを構造体...
-
バイト型のデータを16進表記で...
-
バイナリデーター内の文字を検索
-
ファイルの読みこみ方法とファ...
-
VBScriptの配列は、要素数を指...
-
フォートランのソース変更を試...
-
txtファイルの数字を計算
-
CSVファイルによる検索の高速化
-
日本語を配列に収め、そして表...
-
ファイルをメモリに出力する方法
-
RGBのバイナリデータをCImageに...
-
データグリッドビューの一覧に...
-
C or C++で2次元のデータの並び...
-
Cで2次元配列にCSVファイルを...
-
VBAでテキストファイルを複数開...
-
バイナリ出力
-
バイナリファイルでOutOfMemory...
-
バイナリファイルの一部分をカ...
おすすめ情報