2016-01-18 4 views
1

У меня возникла проблема при чтении файлов на C# с помощью StreamReader. У меня есть файл с кодировкой UTF-8. Я собираюсь упростить его в одной строке для примера. В одной строке есть новая строка. Я читаю кодировку UTF-8, но как только строка читается, похоже, что она не обрабатывает новую строку правильно. Позвольте мне показать примерВозможные проблемы с StreamReader

using (StreamReader sr = new StreamReader(file, Encoding.UTF8)) 
{ 
    string line; 

    while ((line = sr.ReadLine()) != null) 
    { 
     Debug.WriteLine("test1\ntest2" + " - " + "test1\ntest2".GetHashCode()); 
     Debug.WriteLine(line + " - " + line.GetHashCode()); 
    } 
} 

Вот содержимое файла

test1\ntest2 

Здесь выход из этого кода

test1 
test2 - -61586127 
test1\ntest2 - -228288099 

В строке, напечатанное из строкового литерала он обрабатывает \ n как новую строку при ее печати. Когда он печатает строку, считанную из файла, она этого не делает. Вы также можете видеть, что значения хэш-кода различны.

+0

Это не то же самое! В содержимом файла «\ n» - это текст, в коде C# «\ n» - это символ новой строки, потому что символ «\» является escape-символом, который сообщает компилятору, что следующий символ «особый». Если вы используете «\ t», вы указываете символ табуляции – bdn02

+0

Является ли фактическое содержимое файла «\ n» (например, код ascii 92 для «\» и код ascii 110 для «n») или символ новой строки 0x0A? – Jure

+0

У вас есть «\ n» (обратная косая черта и буква n), фактически записанные в вашем файле, или это символ новой строки, и вы просто отображали его так? Это компилятор, который превращает специальную escape-последовательность, такую ​​как «\ n» в строке, в символ новой строки. Когда такая последовательность считывается из файла, это просто «обратная косая черта и буква n», она не будет автоматически преобразована в новую строку. –

ответ

1

Содержимое вашего файла неверно. В C# при использовании литеральных строк символы с добавлением \ обрабатываются как специальные символы (например, \n для NewLine, \r для возврата каретки, \t для вкладок и т. Д.). Это называется экранирование, а \ - символ escape. Последовательность \ и некоторый дополнительный символ приводит к одному окончательному символу внутри строки.

В то время как в содержимом вашего файла присутствуют фактические два символа (\ и n), которые считаются действительными символами не как особый символ. Поэтому в вашем файле вам действительно нужно поместить символ NewLine или заменить \n фактическим C# \n после чтения из потока.

+0

Я не знаю, почему я об этом не думал. Я просто привык видеть \ n как новую строку, я не думал, что это не будет рассматриваться как escape-последовательность при чтении из файла. – thecaptain0220

+0

Да, это тоже меня достало;) Рад помочь. – Jure

Смежные вопросы