![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
ファイルを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で質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/15 15:48
- Excel(エクセル) Excel VBAどこが間違ってますか? 4 2023/07/17 10:04
- Excel(エクセル) マクロでテキストファイルを読み込んだ際の最終セルにデータと改行が含まれる問題の改善方法 2 2022/03/25 16:50
- Excel(エクセル) フォルダ内のワードファイルをPDFに一括変換するVBA 3 2023/06/09 16:51
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Visual Basic(VBA) Excel VBAについて、 フォルダ内のファイルを全て開きたい場合、 FSOを使えば、Dirは使わ 1 2023/01/27 13:18
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
RGBのバイナリデータをCImageに...
-
バイト型のデータを16進表記で...
-
Cで2次元配列にCSVファイルを...
-
ファイルのアクセス回数について
-
エクセルのプロパティーでセキ...
-
エクセルvbaでdocuworksprinter...
-
ExcelブックをGoogleスプレッド...
-
エクセルで複数のコメントのサ...
-
Windows10でコマンドプロンプト...
-
カンマ区切りのCSVファイルから...
-
Wordで差込印刷した後に別々の...
-
デスクトップの画像をhtmlに表...
-
FTPとファイルコピーの違いにつ...
-
【VB.NET】App.configにファイ...
-
多量のファイルをフォルダに自...
-
frxファイルの役目
-
Excel 相対パス
-
ファイル名から該当フォルダへ移動
-
バッチファイル 二つ上のディ...
-
VBA★PDFをPDFアプリで印刷し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DXFファイルをVBで取り込み、図...
-
バイト型のデータを16進表記で...
-
VBAでテキストファイルの改行を...
-
VBAでテキストファイルを複数開...
-
Cで2次元配列にCSVファイルを...
-
バイナリファイルでOutOfMemory...
-
テキストファイルを後ろから読...
-
[VBS] 16進数でバイナリファイ...
-
バイナリ読み込み時のデータ受...
-
ファイル入力のデータを構造体...
-
VBでLOOKUP機能
-
RGBのバイナリデータをCImageに...
-
VBScriptの配列は、要素数を指...
-
Excel VBAで画像解析
-
バイナリ出力
-
バイナリファイルの一部分をカ...
-
perl 特定の文字列をdatファイ...
-
awk getlineをもう一度ファイル...
-
CSVファイルによる検索の高速化
-
ファイル内の(&H0A)を(&H0D0A)...
おすすめ情報