- 締切済み
ファイルから指定位置の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行で出来るんではないかと思います。 「そんなややこしいことをしなくて、このようなやり方で」を教えて下さい。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- tom11
- ベストアンサー率53% (134/251)
こんにちは、 表題とは違いますが。 >このようなファイルを読み込んで出力する演習をしています。 ここの部分に着目して、 >多分、同じことが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から、 探せばいいかと思いますが。 こんなことですか???
- himajin100000
- ベストアンサー率54% (1660/3060)
すまん、勘違いした。撤回。
お礼
全容を示ます。 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
- himajin100000
- ベストアンサー率54% (1660/3060)
そろそろコードは不要でマニュアルだけで十分かなあ。 http://msdn.microsoft.com/en-us/library/x8xxf0x5.aspx http://msdn.microsoft.com/en-us/library/system.io.streamreader.read.aspx
お礼
iNextPosition が -1 であるべき時になっていないなどのバグがあります。 が、問題はあくまでも「ファイルから指定位置の1文字を読み込む」です。 「.NET の開発者達が英語圏だから仕方ないのじゃないの!」 という感想でも構いません。 宜しくお願いします。
お礼
VB.Net とやらを知って50日。 ともかく、色んな手法があって当惑。 組み込み関数にMyなどなど。 初学者の私は、余りのメニューの多さに幻惑されっぱなし。 で、でも、マイクロソフトの厨房では .Net ライブラリが盛り付けられているだけのよう。 そういう事情なら、私も、組み込み関数とかMyとかは演習対象から除外しました。 で、今は、あくまでも .Net ライブラリが関心事です。 ど素人は、それほどに「あっちも、こっちも」という余裕はありません。 この辺りをご理解下さい。 さて、.Net ライブラリにターゲットを絞る大見栄をきっても固定長ファイルだけは別。 しかし、非固定長ファイルは、StreamReaderとTextReaderとが演習対象。 そういう結論に達しました。 で、質問は、My.Computer.FileSystemや組込関数のGetLineメソッド(あればですが)の自作。 そういうことですので宜しくお願いします。