2013-04-15 25 views
9

Napisałem ten kod, aby policzyć liczbę znaków w pliku tekstowym:Znak nowego wiersza w C#

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

ale po zastosowaniu tego kodu do pliku zawiera:

1 
2 
3 
4 
5 
6 
7 
8 
9 
0 

Ccount = 30 ???? dlaczego? Używam Windows XP na wirtualnym polu na moim Macbook program używany: Microsoft Visual Basic 2010.

+4

Znak + powrót + nowa linia = 3 znaki na linię = 3 * 10 = 30 w sumie. –

+0

10 znaków + 10 znaków powrotu karetki + 10 linii? '? \ r \ n' –

+0

Środowisko.Nowe Wiersz powinien pasować do znaku nowego wiersza w dowolnym systemie operacyjnym. –

Odpowiedz

14

W systemie Windows każda nowa linia składa się z dwóch znaków \r i \n. Masz 10 linii, każda linia ma 1 widoczne znaki i 2 nowe znaki, które składają się z maksymalnie 30 znaków.

Jeśli utworzyłeś swój plik na Macu lub Unixie/Linuksie, otrzymasz inny wynik (20 znaków). Ponieważ Unix używa tylko \n, a Mac używa tylko \r dla nowej linii.

Można użyć niektórych edytorów (takich jak Notepad ++), aby pokazać nowe znaki linii, a nawet przełączać się między różnymi trybami (DOS/Unix/Mac).

+0

Dziękuję Panu Sinie – ammarx

13

Czytasz jeden znak na raz, a każda linia zawiera trzy znaki:

  • jeden cyfrowy
  • jeden wózek zwrotny (\r)
  • jednej nowej linii (\n)

(Windows używa \r\n jako sekwencji nowej linii. Fakt, że korzystasz z maszyny wirtualnej na Macu, nie ma na to wpływu.)

2

Nowa linia to właściwie 2 oddzielne znaki: LF CR (powrót do wiersza i powrót karetki). Ale wiesz, że jeśli umieścisz punkt przerwania w swojej pętli. A teraz, dla dodatkowego kredytu, ile bajtów jest w Unicode?

2

System Windows zazwyczaj używa \r\n dla nowej linii, czyli znaków ASCII 0x13 i 0x10.

Zaproponuj udowodnić to sobie w ten sposób:

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

Jest łatwiejszy sposób, aby to zrobić. Zrób cały plik * .txt do tablicy łańcuchów i zmierzyć:

int count = 0; 

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

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