Символ новой строки в c#

Я написал этот код, чтобы подсчитать количество символов в текстовом файле :

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

но после применения этого кода в файле содержится :

1
2
3
4
5
6
7
8
9
0

Ccount = 30 ???? почему? Я использую Windows Xp на виртуальной коробке на моем Macbook используемая программа: Microsoft Visual Basic 2010.

5 ответов


В Windows каждая новая строка состоит из двух символов \r и \n. У вас есть 10 строк, каждая строка имеет 1 видимый символ и 2 новых символа строки, которые добавляют до 30 символов.

если вы создали свой файл в Mac или Unix / Linux, вы бы получили другой результат (20 символов). Потому что Unix использует только \n и Mac использует только \r для новой линии.

вы можете использовать некоторые редакторы (например Notepad++), чтобы показать вам новые символы, или даже переключение между различными режимами (DOS / Unix / Mac).


ты читаешь по одному символу за раз, и каждая строка содержит три символа:

  • цифра
  • один возврат каретки (\r)
  • в одну строку (\n)

(Windows использует \r\n как его последовательность новой строки. Тот факт, что вы работаете в виртуальной машине на Mac не влияет на это.)


есть более простой способ сделать это. Сделайте весь *.txt файл в строковый массив и измерить его:

int count = 0;

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

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

Windows обычно использует \r\n для новой строки это символы ASCII 0x13 и 0x10.

предложите вам доказать это себе, сделав это:

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

новая строка фактически состоит из 2 отдельных символов: LF CR (подача строки и возврат каретки). Но вы бы знали это, если бы вы поставили точку останова в своем цикле. Теперь для дополнительного кредита, сколько байтов в unicode?