2009-03-28 9 views
1

私はファイルがあります。私がメモ帳でそれを開くとき、私はcharachtersを一行で見る。しかし、そのファイルをWordPadNotepad++のような他のアプリケーションで開くと、私はcharachters間の不規則な改行を見ることができ、それらは複数の行に表示されます。これらの改行は、私がreader.Readline()を実行すると表示されます。メモ帳をC#で行を読むのと同様に実行するにはどうすればよいですか?C#メモ帳同様にファイルを読み取る

答えて

2

var path = "c:/test.txt"; 

File.WriteAllText(path, "a\nb\r\nc"); 

using (var stream = File.OpenRead(path)) 
using (var reader = new StreamReader(stream, Encoding.ASCII)) 
{ 
    var lineBuilder = new StringBuilder(); 
    string line; 
    char currentChar; 
    int nextChar; 
    while (!reader.EndOfStream) 
    { 
     currentChar = (char)reader.Read(); 
     nextChar = reader.Peek(); 

     if (!(currentChar == '\r' && nextChar == '\n')) 
     { 
      lineBuilder.Append(currentChar); 
     } 

     if((currentChar == '\r' && nextChar == '\n') || nextChar == -1) 
     { 
      line = lineBuilder.ToString(); 
      Console.WriteLine(line); 

      lineBuilder = new StringBuilder(); 

      reader.Read(); 
     } 
    } 
} 
+0

んので... –

4

このような違いは、通常、ファイルのエンコードに使用されるあいまいさのためです。ファイルの先頭を正しく解析するには、適切なエンコーディングを使用する必要があります。どの文字が問題を引き起こしていますか?また、 - ファイル上で(例えば)StreamReaderを作成するときにバイトが使用されるエンコーディングに法的でない場合は、すべてのベットは;-p

オフになっているあなたは、エンコーディングを指定することができます。

using (Stream stream = File.OpenRead(path)) 
    using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)) 
    { 
     string line; 
     while ((line = reader.ReadLine()) != null) 
     { 
      Console.WriteLine(line); 
     } 
    } 

ベース64を送信すると、問題は行の中央にある\rになります。基本的な文字列としてこれを読むには、使用できます。ただ

byte[] data = File.ReadAllBytes(path); 
string txt = Encoding.UTF8.GetString(data); 

かを:

string text = File.ReadAllText("foo.txt"); 

しかし、あなたは常に困難これを表示しています。あなたのの行末(おそらくcrlf)に設定してSplitにすることができます。 StreamReaderは、のように見えるものに分割しています。のように行末があります。

string[] lines = s.Split(new string[] {"\r\n"}, StringSplitOptions.None); 
+0

を撃った私は添付可能性がしたいですここにファイルしてください。 –

+0

確かに。ファイルの基礎となるバイトで「面白い」のように聞こえます。大きいですか?私は彼がライン終端用の\ rを\ nのシーケンスを使用したいと思いますBrijeshを理解している場合は、進/ 64進表現... –

+0

MjAwOTAzMDR8RVVST3x8MDAwMDJ8RkZGRnwgfEF8U3w3MTB8TUxJICAgfCB8fA0gIHwgLjAwMDAwfCAuMDAwMDB8LjAwMDAwfDIwMDkwMzA0IDA4OjMxOjIzOjYxQU18IHwgfCB8IHwgICAgfHwgICAgfCB8LjAwfCAgIAの== –

0

これはあなただけのすべてのテキストをロードし、正規表現か何かを使用して行に分割できることが重要でない場合は、私からの第二の答えのために申し訳ありませんが、私はちょうど気づい

var path = "c:/test.txt"; 

File.AppendAllText(path, "lala\nlala\nlalal"); 
var text = File.ReadAllText(path); 

Console.WriteLine(Regex.Split(text, Environment.NewLine).Length); 
+0

ファイルサイズがライブである簡単な答えを持っていません –

0

使用

:あなたはそうのような、Rの\ nを\次の文字を取得し、現在のかどうかを確認し、次のされているために、PEEKを使用することができます1内のすべての行を抽出するために
String[] lines = File.ReadAllLines("c:\\text.txt"); 

は、私は、単一のラインとして、それを参照してください。その唯一のメモ帳、それぞれが二つにラインを壊している、このファイルのエンコーディングセットのすべての種類を試してみました

関連する問題