2013-04-15 13 views
9

Ho scritto questo codice per contare il numero di caratteri in un file di testo:Nuovo personaggio linea in C#

sr.BaseStream.Position = 0; 
sr.DiscardBufferedData(); 
int Ccount = 0; 
while (sr.Peek() != -1) 
{ 
    sr.Read(); 
    Ccount++; 
} 

ma dopo l'applicazione di questo codice in un file contiene:

1 
2 
3 
4 
5 
6 
7 
8 
9 
0 

CCOUNT = 30 ???? perché? Sto usando Windows Xp sulla scatola virtuale sul mio Macbook il programma utilizzato: Microsoft Visual Basic 2010.

+4

Carattere + ritorno + nuova riga = 3 caratteri per riga = 3 * 10 = 30 in totale. –

+0

10 caratteri + 10 ritorni a capo + 10 avanzamenti di riga? '? \ r \ n' –

+0

Environment.NewLine dovrebbe corrispondere al carattere di nuova riga in qualsiasi sistema operativo. –

risposta

14

In Windows ogni nuova riga è composta da due caratteri \r e \n. Hai 10 linee, ogni riga ha 1 caratteri visibili e 2 nuovi caratteri riga che possono contenere fino a 30 caratteri.

Se hai creato il tuo file in Mac o Unix/Linux avresti gotton risultato diverso (20 caratteri). Poiché Unix utilizza solo \n e Mac utilizza solo \r per una nuova riga.

È possibile utilizzare alcuni editor (come Notepad ++) per mostrare nuovi caratteri di linea o persino passare da una modalità all'altra (DOS/Unix/Mac).

+0

Grazie Signor Sina – ammarx

13

Stai leggendo un carattere alla volta, e ogni riga contiene tre personaggi:

  • uno cifre
  • un ritorno carrello (\r)
  • una nuova riga (\n)

(Windows usa \r\n come sequenza di nuova riga. Il fatto che tu stia eseguendo una VM su un Mac non ha alcun effetto.)

2

La nuova riga è in realtà 2 caratteri separati: LF CR (avanzamento riga e ritorno a capo). Ma lo sapresti se inserirai un breakpoint nel tuo loop. Ora per un credito extra, quanti byte è in Unicode?

2

Windows in genere utilizza \r\n per la nuova riga, ovvero caratteri ASCII 0x13 e 0x10.

suggerisco di provare questo a te stesso in questo modo:

Console.WriteLine("0x{0:x}", sr.Read()); 
3

C'è un modo più semplice per fare questo. Trasforma l'intero file * .txt in un array di stringhe e misuralo:

int count = 0; 

string[] Text = File.ReadAllLines(/*Path to the file here*/); 

for (int i = 0; i < Text.Count(); i++) 
{ 
     count += Text[i].Length; 
}