アプリ版:「スタンプのみでお礼する」機能のリリースについて

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行で出来るんではないかと思います。

「そんなややこしいことをしなくて、このようなやり方で」を教えて下さい。

A 回答 (3件)

そろそろコードは不要でマニュアルだけで十分かなあ。



http://msdn.microsoft.com/en-us/library/x8xxf0x5 …

http://msdn.microsoft.com/en-us/library/system.i …
    • good
    • 0
この回答へのお礼

iNextPosition が -1 であるべき時になっていないなどのバグがあります。
が、問題はあくまでも「ファイルから指定位置の1文字を読み込む」です。

「.NET の開発者達が英語圏だから仕方ないのじゃないの!」

という感想でも構いません。
宜しくお願いします。

お礼日時:2009/03/11 08:52

すまん、勘違いした。

撤回。
    • good
    • 0
この回答へのお礼

全容を示ます。

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

お礼日時:2009/03/10 20:18

こんにちは、



表題とは違いますが。

>このようなファイルを読み込んで出力する演習をしています。

ここの部分に着目して、

>多分、同じことが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から、
探せばいいかと思いますが。

こんなことですか???
    • good
    • 0
この回答へのお礼

VB.Net とやらを知って50日。
ともかく、色んな手法があって当惑。
組み込み関数にMyなどなど。
初学者の私は、余りのメニューの多さに幻惑されっぱなし。
で、でも、マイクロソフトの厨房では .Net ライブラリが盛り付けられているだけのよう。
そういう事情なら、私も、組み込み関数とかMyとかは演習対象から除外しました。
で、今は、あくまでも .Net ライブラリが関心事です。
ど素人は、それほどに「あっちも、こっちも」という余裕はありません。
この辺りをご理解下さい。

さて、.Net ライブラリにターゲットを絞る大見栄をきっても固定長ファイルだけは別。
しかし、非固定長ファイルは、StreamReaderとTextReaderとが演習対象。
そういう結論に達しました。

で、質問は、My.Computer.FileSystemや組込関数のGetLineメソッド(あればですが)の自作。
そういうことですので宜しくお願いします。

お礼日時:2009/03/10 19:36

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!