- 締切済み
VB2008 ファイルから指定位置の文字を読み込む方法??
D:\Temp\Test.txt abc123あいう亜伊宇 [イミディエイトウインドウ] ? FileSeek("D:\Temp\Test2.txt", 1) "a" ? FileSeek("D:\Temp\Test.txt", 7) "あ" ? FileSeek("D:\Temp\Test.txt", 8) "あ" 今、FileStream の Seek メソッドを利用した指定位置の文字を1文字だけ戻す関数を作成。 なんとか動作だけはしています。 そこで、私が質問したいのは日本語の扱いのエレガントな方法です。 Seek メソッドでは2バイト文字の1バイト目と2バイト目とを読むケースが発生します。 私は、いずれの場合も"□・"とかではなく"あ"を戻させたいと思っています。 そのために私が考えた方法は次ようです。 ' -------------------------------- ' 指定の位置より2バイト読み込む ' -------------------------------- fs.Seek(p - 1, SeekOrigin.Begin) fs.Read(Buf, 0, Buf.Length) C = ec.GetString(Buf) ' ------------------------------------------ ' 指定の位置より1つ戻して2バイト読み込む ' ------------------------------------------ If p > 1 Then fs.Seek(p - 2, SeekOrigin.Begin) fs.Read(Buf, 0, Buf.Length) D = ec.GetString(Buf) End If ・・・・・ ・・・・・ FileSeek2 = If(Len(D & "") = 1, D, Left(C, 1)) 仮に、最初の読み込みで3バイトを読み込んで2バイト目が何なのかを判別できると・・・。 そうすれば、2度読みする必要はないと思います。 そこで、その方法をご存じであればコードを含めて教えて頂ければ幸いです。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- nekonokota
- ベストアンサー率45% (27/59)
実行結果のコンソールの表示を入れるの忘れた(汗 ↓実行結果 数字入力->5 文字:3 場所:5 数字入力->9 文字:亜 場所:9 数字入力->7 文字:い 場所:7 数字入力->11 文字:宇 場所:11 数字入力->
- nekonokota
- ベストアンサー率45% (27/59)
Sub Main() Dim str As String = "abc123あいう亜伊宇" While True Console.Write("数字入力->") Dim pos As Integer = Convert.ToInt32(Console.ReadLine()) Console.WriteLine("文字:{0} 場所:{1}", str(pos), pos) End While End Sub こんな感じのこと…を実装したいのでしょうか? 注意>即興に書いたコードなので無限ループになってます。ご注意を。
- nekonokota
- ベストアンサー率45% (27/59)
charは、1文字の値(Unicode)で、ビット長は16ビットです。 半角文字も内部処理上16ビットでやっているはず(記憶があいまいで申し訳ない)。 seek(file, value - 1) これだけで行けるんじゃないかと。
お礼
回答ありがとうございます。 VISTA搭載のノートブックを買ってVB2008Expressをダウンロード。 数行のプログラムを2つだけ作っただけです。 ですから、アドバイスを十分に理解することができません。 もう、少し、勉強してみます。
お礼
>こんな感じのこと…を実装したいのでしょうか? この度、VISTA搭載のノートブックを買いました。 そこで、VB 2008 Express をダウンロード。 基本通りに hello, world から学習を開始しました。 main() { long nc; nc = 0; while (getchar() != EOF) ++nc; printf("%1d\n", nc); } 今、ここまで進んでいます。 が、困ったことに VB 2008 で getchar()に相当するものがありません。 で、自作している訳です。 本来ならばAPIを利用してキー入力を監視する関数を作成すべきところ。 が、実用的ではないのでファイル読み込みに変えての演習に切り替えました。 ところが、Seekメソッドでも以下のSeek関数でも2バイト文字の後半を指定すると化け字に。 最終的には、次のように「その都度にシコシコと文字数を文頭から勘定」しています。 Function FileGetChar(ByVal f As String, ByVal p As Short) As String Dim i As Integer = 1 Dim j As Integer = 0 Dim n As Integer = FreeFile() Dim c As Char If File.Exists(f) Then FileOpen(n, f, OpenMode.Random, OpenAccess.Read, , 1) Do Wile Not EOF(n) Seek(n, i + j) FileGet(n, c) j = j - (Math.Abs(Asc(c)) > 255) i = i + 1 If i > p Then Exit Do Else C = "" End If Loop FileClose(n) End If FileGetChar = Replace(c, Chr(0), "") End Function 要は、このような関数を作成したい訳です。 何か、「その都度にシコシコと文字数を文頭から勘定」以外の策があればお願いします。
補足
EOF判断が正しくないです!