C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VC#_StreamReader.ReadLineについて


(過去ログ 14 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■4920 / inTopicNo.1)  VC#_StreamReader.ReadLineについて
  
□投稿者/ CHOBI (1回)-(2007/06/28(Thu) 19:19:59)

分類:[C# (Windows)] 

お世話になります。
本日よりVC# 2005始めた初心者です。
txtファイルより行数をカウントするサンプルを参考書見ながら作っていたのですが、
実際の行数の倍をカウントしてしまいます。
改行コード(CR/LF)の関係かと思うのですが、下記の15行目を
Console.WriteLine("{0}", lineCount); --> Console.WriteLine("{0}:{1}", lineCount, sr.ReadLine());
にし、ステップ実行させると読み込んだ行数とlineCountの値は一致するのですが・・・・

質問(1) --> ReadLineは "CR"が読めないのでしょうか?
質問(2) --> 何故、sr.ReadLine() を Console.WriteLine すると正確にカウントできるのでしょうか?

すみませんが、どこかで聞いた事があるような気がするのですが、失念してしまいました。
ご指導の程、お願い致します。

1 //行数をカウントするメソッド
2 public void GetLineCountFromFile()
3 {
4 if (!File.Exists(filename))
5 {
6 --lineCount;
7 }
8 else
9 {
10 FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read);
11 StreamReader sr = new StreamReader(fs);
12 while (sr.ReadLine() != null)
13 {
14 lineCount += 1;
15 Console.WriteLine("{0}", lineCount);
16
17 }
18 fs.Close();
19 }
20 }
引用返信 編集キー/
■4925 / inTopicNo.2)  Re[1]: VC#_StreamReader.ReadLineについて
□投稿者/ Kazuki (13回)-(2007/06/28(Thu) 21:23:43)
Kazuki さんの Web サイト
うちでは、下でちゃんと行数とれましたけど。

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace ConsoleApplication1 {
    class Program {
        static void Main(string[] args) {
            using (StreamReader sr = new StreamReader("a.txt")) {
                int count = 0;
                while (sr.ReadLine() != null) {
                    count++;
                }
                Console.WriteLine(count);
            }
        }
    }
}

引用返信 編集キー/
■4927 / inTopicNo.3)  Re[1]: VC#_StreamReader.ReadLineについて
□投稿者/ よねKEN (51回)-(2007/06/28(Thu) 21:55:27)
よねKEN さんの Web サイト
変数lineCountはインスタンス変数(または静的変数)だと思いますが、
GetLineCountFromFileメソッドを呼び出す前にlineCountを0で初期化していますか?

引用返信 編集キー/
■4930 / inTopicNo.4)  Re[2]: VC#_StreamReader.ReadLineについて
□投稿者/ CHOBI (2回)-(2007/06/29(Fri) 08:17:39)
よねKEN さん、kazukiさんお返事ありがとうございます。
原因は私の勘違いでした。(掲示板汚してすみませんでした)
何故、私が”実際の行数の倍”と認識したかというと
最初の”行数カウント”の後に”中身表示”を実行させておりました。
行数カウント --> 128行
中身表示 ------> 64行
と表示されたためです。
単純に"中身表示"は "sr.ReadLine()"を2回実行していただけでした。

何分昨日より "VS 2005"いじり始めた初心者で、ツールの使い方に気を取られて
気が付きませんでした。どうかご勘弁下さい。


//中身を表示するメソッド
public void IndicateLine()
{
if (!File.Exists(filename))
{
Console.WriteLine("{0}は存在しません", filename);
}
else
{
FileStream fs = File.Open(filename, FileMode.Open, FileAccess.Read);
StreamReader sr = new StreamReader(fs);
while (sr.ReadLine() != null)
{
++cnt;
Console.WriteLine("{0}:{1}", cnt, sr.ReadLine());
}
fs.Close();
引用返信 編集キー/
■4931 / inTopicNo.5)  Re[3]: VC#_StreamReader.ReadLineについて
□投稿者/ CHOBI (3回)-(2007/06/29(Fri) 08:41:11)
度々すみません。
”解決済み”チェック忘れておりました。
一応、本サイトで推奨されている "Peek()" でチェック後、
"ReadLine" で中身表示するようにしてうまくいきました。
ありがとうございました。
解決済み
引用返信 編集キー/
■4934 / inTopicNo.6)  Re[4]: VC#_StreamReader.ReadLineについて
□投稿者/ 渋木宏明(ひどり) (255回)-(2007/06/29(Fri) 09:59:21)
渋木宏明(ひどり) さんの Web サイト
> 一応、本サイトで推奨されている "Peek()" でチェック後、
> "ReadLine" で中身表示するようにしてうまくいきました。

は、一般的な実装とは言いがたいです。

int count= 0;

using (FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read))
{
  using (StreamReader reader = new StreamReader(stream))
  {
    for (string text = reader.ReadLine(); text != null; text = reader.ReadLine())
    {
      ++count;
      Console.WriteLine("{0}:{1}", count, text);
    }

    reader.Close();
  }

  stream.Close();
}

のように、ReadLine() の戻り値を変数に保存するようにすれば Peek() は不要です。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -