none
StreamReader の ReadLine の戻り値 RRS feed

  • 質問

  • VB.net初心者です。よろしくお願いいたします。

    MSDNやVB.netの参考書には、

    Nothing if the end of the input stream is reached." id="mt7" jQuery171009753632888923907="7">入力ストリーム(あるいはファイル)の末尾に到達した場合、戻り値は Nothing です。 」

    とありますが、テキストファイルの読み込みを実際にやってみるとファイル内に空行があると

    そこでNothingが返ってきてしまい、本当のファイルの末尾が検出できませんでした。

    この症状は普通の事でしょうかそれとも私の環境だけなのでしょうか?

    ちなみに、Stream.WriteLineで作成した空行を含むファイルに対して実行しても

    通常のテキストエディタで作成したファイルでも同じ症状でした。

    (ファイルのエンコーディングはShift-JISです。)

    以上、よろしくお願いいたします。

    2012年7月2日 5:36

回答

  • もしかして、Nothingとの比較を = 演算子で行っていませんか?

    空文字列とNothingを = 演算子で比較したときTrueが返るのはVBの仕様です。

    純粋にNothingかどうかを判定する場合、hoge Is Nothing という式を使用します。

    • 回答としてマーク takushin 2012年7月2日 6:34
    2012年7月2日 5:49

すべての返信

  • もしかして、Nothingとの比較を = 演算子で行っていませんか?

    空文字列とNothingを = 演算子で比較したときTrueが返るのはVBの仕様です。

    純粋にNothingかどうかを判定する場合、hoge Is Nothing という式を使用します。

    • 回答としてマーク takushin 2012年7月2日 6:34
    2012年7月2日 5:49
  • 検証してみましたが、少なくとも2008(Framework3.5)の環境では再現しません。

    気になる所として、Nothing判定ってどのように行っていますか?

    以下検証したソースです。

        Private Function GetList() As List(Of String)
            Using reader As New System.IO.StreamReader("D:\a.txt", System.Text.Encoding.GetEncoding("Shift_JIS"))
    
                Dim lines As New List(Of String)
                Do
                    Dim line As String = reader.ReadLine()
                    If line Is Nothing Then
                        Exit Do
                    End If
                    lines.Add(line)
                Loop
                Return lines
            End Using
    
        End Function
    2012年7月2日 5:50
  • Hongliangさんありがとうございました。

    比較を=演算子でやっていました。 hoge is Nothing にすると正常に機能しました。

    MSDNの下記URLで表示されるサンプルが読み込みのはずなのに何故か

    WriteLineメソッドの説明のようでファイル末尾のチェック方法が判らず統合で比較していました。

    http://msdn.microsoft.com/ja-jp/library/system.io.streamreader.readline.aspx

    MSDNがもう少しまともになっていれば皆さんにお手間をお掛けすることが減ると思いますが...

    今後ともよろしくお願いいたします。

    2012年7月2日 6:43
  • MSDNがもう少しまともになっていれば

    Stream の終わりを判断するときだけの問題ではありません。
    Nothing かどうかを判断するのに Is を使うのは VB を使う上で最初に知っておくべきことです。


    2012年7月2日 6:57
  • MSDNの下記URLで表示されるサンプルが読み込みのはずなのに何故か

    WriteLineメソッドの説明のようでファイル末尾のチェック方法が判らず統合で比較していました。

    http://msdn.microsoft.com/ja-jp/library/system.io.streamreader.readline.aspx

    ん? このサンプルで、Console.WriteLineは単にReadLineの結果を出力するために使ってるだけですよ?

    こちらでは末尾かどうかをPeekメソッドを使って(ReadLineの前に)判定していますね。

    2012年7月2日 7:02
  • Hongliangさんご指摘ありがとうございます。

    確かにサンプルをよく見てみると ReadLine メソッドが1行だけありました。

    WriteLineが大量にあったため見落としてしまいました。

    ただ、素人の要望としては説明の中で「戻り値はNothingです」と言っているので

    サンプルもNothingを判別する様なサンプルになっていると判りやすいかなと

    思っています。

    まあ、Peekの使い方も知ることができたので無駄にはならなかったですが...

    2012年7月2日 7:40