• 締切済み

ファイルから指定位置の1文字を読み込むには?(VB2008)

D:\Temp\ForGrep.txt Ah Love! could you and I with Fate conspire To grasp this sorry Scheme of Things entere, Would not we shatter it to bits -- and then Re-mould it nearer to the heart's Desire! このようなファイルを読み込んで出力する演習をしています。 ' ============================== ' 全ての行を読み込んで出力する ' ============================== Module theGrap   Sub Main()     Dim iNow As Integer = 0     Dim iNext As Integer = 0     Do       iNow = iNext       Debug.Print(ReadLine("D:\Temp\ForGrep.txt", iNow, iNext))     Loop Until iNext = -1   End Sub End Module ReadLine 関数でファイルの先頭0バイト目から1行を読み込む。 ReadLine 関数は、次の行が存在する可能性があれば次の行の開始バイトを iNext に代入。 ReadLine 関数は、次の行が存在しなければ iNext には -1 を代入。 聞きたいのは、あるポジションから1文字づつ行末まで読み込む方法です。 ' ---------------------------------------- ' ファイルから指定位置の1文字を読み込む ' ---------------------------------------- Private Function GetString(ByVal fs As FileStream, _               ByVal iPP As Integer) As String   Dim c As String = ""   Dim d As String = ""   Dim Buf(1) As Byte   Dim ec As Encoding = Encoding.Default   ' --------------------------------   ' 指定の位置より2バイト読み込む   ' --------------------------------   fs.Seek(iPP, SeekOrigin.Begin)   fs.Read(Buf, 0, Buf.Length)   c = ec.GetString(Buf)   ' ----------------------------------------------   ' 指定の位置より1バイト戻って2バイト読み込む   ' ----------------------------------------------   If iPP > 0 Then     fs.Seek(iPP - 1, SeekOrigin.Begin)     fs.Read(Buf, 0, Buf.Length)     d = ec.GetString(Buf)   End If   Return If(d.Length = 1, d, c.Substring(0, 1)) End Function 今、私は、このように非常にややこしい手順で1文字づつ読み込んでいます。 なんか、とんでもない無駄なことをしているような気がします。 多分、同じことが1行で出来るんではないかと思います。 「そんなややこしいことをしなくて、このようなやり方で」を教えて下さい。

みんなの回答

  • tom11
  • ベストアンサー率53% (134/251)
回答No.3

こんにちは、 表題とは違いますが。 >このようなファイルを読み込んで出力する演習をしています。 ここの部分に着目して、 >多分、同じことが1行で出来るんではないかと思います。 ここの部分から、以下のコードを書きました。 Module Module1 Sub Main() Dim fn As String = "C:\Documents and Settings\*****\My Documents\*****\goo_teach.txt" Dim line As String = My.Computer.FileSystem.ReadAllText(fn) Console.WriteLine(line) End Sub End Module 問題の英文の入っているファイルの名(goo_teach.txt)を、 読み込んで、コンソールに、すべて出力します。 ファイルに入っている文字が、全部変数lineに入っているので、 目的の文字を探したいなら、lineから、 探せばいいかと思いますが。 こんなことですか???

noname#140971
質問者

お礼

VB.Net とやらを知って50日。 ともかく、色んな手法があって当惑。 組み込み関数にMyなどなど。 初学者の私は、余りのメニューの多さに幻惑されっぱなし。 で、でも、マイクロソフトの厨房では .Net ライブラリが盛り付けられているだけのよう。 そういう事情なら、私も、組み込み関数とかMyとかは演習対象から除外しました。 で、今は、あくまでも .Net ライブラリが関心事です。 ど素人は、それほどに「あっちも、こっちも」という余裕はありません。 この辺りをご理解下さい。 さて、.Net ライブラリにターゲットを絞る大見栄をきっても固定長ファイルだけは別。 しかし、非固定長ファイルは、StreamReaderとTextReaderとが演習対象。 そういう結論に達しました。 で、質問は、My.Computer.FileSystemや組込関数のGetLineメソッド(あればですが)の自作。 そういうことですので宜しくお願いします。

回答No.2

すまん、勘違いした。撤回。

noname#140971
質問者

お礼

全容を示ます。 Module mdlFileSystem   Function ReadLine(ByVal aFile As String, _            ByVal iNowPosition As Integer, _            ByRef iNextPosition As Integer) As String     Dim aChar As String     Dim aChars As String = ""     If File.Exists(aFile) Then       Try         Using fs As FileStream = New FileStream(aFile, FileMode.Open, FileAccess.Read)           Do             aChar = GetString(fs, iNowPosition)             If aChar <> Chr(13) Then               aChars &= aChar             Else               iNowPosition = iNowPosition - 1               Exit Do             End If             iNowPosition += txt.LenB(aChar)           Loop While iNowPosition < fs.Length And aChar <> Chr(13)           iNextPosition = NextPosition(fs, iNowPosition)           fs.Close()           Return aChars         End Using       Catch ex As IOException         MsgBox(ex.Message & "(ReadLine)", , "告知:")         Return ""       End Try     Else       Return ""     End If   End Function   Private Function NextPosition(ByVal fs As FileStream, ByVal iP As Integer) As Integer     If (GetString(fs, iP + 2) = Chr(10) Or GetString(fs, iP + 2) = Chr(13)) And (GetString(fs, iP + 1) = Chr(10) Or GetString(fs, iP + 1) = Chr(13)) Then       iP += 3     ElseIf GetString(fs, iP + 2) = Chr(10) Or GetString(fs, iP + 2) = Chr(13) Then       iP += 2     Else       iP = -1     End If     Return iP   End Function   Private Function GetString(ByVal fs As FileStream, ByVal iPP As Integer) As String   ・・・・・   End Function End Module

回答No.1
noname#140971
質問者

お礼

iNextPosition が -1 であるべき時になっていないなどのバグがあります。 が、問題はあくまでも「ファイルから指定位置の1文字を読み込む」です。 「.NET の開発者達が英語圏だから仕方ないのじゃないの!」 という感想でも構いません。 宜しくお願いします。

関連するQ&A