Как считывать специальные символы с

от admin

Чтение спецсимволов из файла

Как сделать, чтобы StreamReader при чтении текстового файла .txt определял спецсимволы и получалось:

Блаблабла \r\n блаблабла

Подскажите, пожалуйста. Пробовал добавлять в код куски, вроде

Но ничего толкового это не дало, как бы ни выворачивался, всё равно не хочет воспринимать символы. UPD: В общем, объясню: текстовый файл из 5 строк. Первая строка — заголовок. Остальные семь — текст. Строки читаются, и каждая помещается в свой label на форме. Заголовок — строка длинная, в форме не умещается. Чтобы уместить её, я решил использовать спецсимволы (дабы делать перенос).

как читать специальные символы, такие как é, â и другие в С#

Но оба утверждения не понимают эти специальные символы. Как я должен читать?

ОБНОВИТЬ ###

Я также пробую все кодировки с помощью

но все еще не понимаю эти специальные символы.

откуда вы знаете, что ваша программа не принимает эти символы? что ты с ними делаешь? если вы выплевываете их обратно на консоль, возможно, ваш терминал не отображает их правильно, но вы их читаете нормально. — mpen

Что не правильно читается? Покажите строку образца текста с данными, которые были прочитаны неправильно, результат, который вы наблюдаете, результат, который вы ожидаете, и то, как вы сделали наблюдение. — Joel Coehoorn

5 ответы

Нет такого понятия, как «специальный символ». Скорее всего, это расширенные символы ascii из набора latin1 (iso-8859-1). Вы можете прочитать их, явно указав кодировку для чтения потока (в противном случае он будет использовать UTF8)

string[] lines = File.ReadAllLines(fileName,System.Text.Encoding.GetEncoding(«iso-8859-1»)); тоже отлично работает — Мухаммад Рехан Кадри

Это решает мою проблему, но я не понимаю, почему. В моем случае мой потоковый ридер заменил «ë» на «�» при просмотре файла json (при анализе с помощью UTF-8). Почему, однако, UTF-8 наверняка знает символ «ë», а json не имеет известной мне кодировки? Или это связано со средой выполнения .NET или чем-то еще? — Даниэль Кэмпс

После применения этого моя проблема решена для умножения и знака плюс, но апостроф + S (‘s) не отображается должным образом, он заменил этот знак квадратом. как это исправить? — Brijesh

Как считывать специальные символы с

Для ввода данных в консоли может использоваться функция scanf() . Эта функция определена в заголовочном файле stdio.h (там же, где и функция printf) и имеет следующее формальное определение:

И форматная_строка, и аргументы для функции scanf обязательны.

Форматная_строка содержит спецификации преобразования, которые определяют вводимые данные. Общий вид спецификаций преобразования:

Из этих элементов обязательны только два: знак процента % и спецификатор.

Спецификатор определяет тип вводимых данных:

%c : считывает один символ

%d : считывает десятичное целое число

%i : считывает целое число в любой системе (десятичной, шестнадцатеричной, восьмеричной)

%u : считывает положительное целое число

%e : считывает число с плавающей точкой в экспоненциальной форме

%E : считывает число с плавающей точкой в экспоненциальной форме с заглавным символом экспоненты

%f : считывает число с плавающей точкой

%F : считывает число с плавающей точкой

%g : считывает число с плавающей точкой

%G : считывает число с плавающей точкой

%o : считывает восьмеричное число

%x : считывает шестнадцатеричное число

%X : считывает шестнадцатеричное число

%s : считывает строку

%% : считывает символ процента

Символ звездочки * в спецификации преобразования позволяет пропустить при вводе водимые символы для типа, указанного через спецификатор.

Ширина_поля представляет целое положительное число, которое позволяет определить, какое количество байтов будет учитываться при вводе.

Модификаторы позволяют конкретизировать тип данных. В частности, есть следующие модификаторы:

h : для ввода значений типа short int ( %hd )

l : для ввода значений типа long int ( %ld ) или double ( %lf , %le )

L : для ввода значений типа long double ( %Lf , %Le )

Читать:
Youtube что такое заряженные частицы

В качестве аргументов в функцию scanf() передаются адреса переменной, которая будет получать введенное значение. Для получения адреса переменной перед ее именем ставится знак амперсанда & . Например, если переменная называется age , то ее адрес мы можем получить с помощью выражения &age .

Например, введем с консоли числовое значение:

Здесь вводится значение для переменной age, которая представляет тип int , поэтому в форматную строку в функции scanf передается спецификатор %d . Здесь не используется ни символ звездочки, ни ширина поля, ни модификаторы. Вторым параметром идет адрес переменной age — &age .

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

Аналогичен будет ввод данных других типов:

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

Можно сразу вводить несколько значений. В этом случае в качестве разделителя используется пробел:

При вводе данных в консоли функция scanf может использовать пробелы в качестве разделителей, чтобы выдернуть из ввода значения для определенных переменных. Консольный ввод-вывод:

Ввод строк

Функция scanf() также позволяет вводить строки. Например:

Здесь для имени выделяется 10 символов. Теоретически мы можем ввести и большее количество символов, но чтобы только 10 из них учитывались, в строку форматирования передается ширина поля, которая представляет 10 символов — %10s . Когда функция считает достаточное количетсво символов, она прекратит считывание.

Обратите внимание, что для ввода строки перед названием переменной не указывается символ адреса.

Потому что название массива уже само по себе представляет адрес на первый элемент массива.

Возможный консольный вывод:

Однако при использовании этой функции мы можем столкнуться с рядом проблем. Прежде всего попробуйте ввести в предыдущем примере составное имя, в которм подстроки разделены пробелами, например, «Tom Smith».

Для решения этой проблемы можно использовать один хак:

Спецификатор %10[^\n] указавает, что мы по прежнему считываем неболее 10 символов. Квадратные скобки [] представляют позволяют определить набор символов, которые будут извлекаться из ввода или, наоборот, игнорироваться. Так, выражение [^\n] говорит, что надо считать ввод до тех пор пока не встретиться символ перевода строки ‘\n’, то есть пока пользователь не нажмет на клавишу Enter.

Язык Си в примерах/ASCII-коды символов

Главный цикл этой программы напоминает таковой для рассмотренной в разделе Максимум; в частности, мы вновь используем цикл «пока» ( while ). [1] Однако, вместо scanf для чтения чисел, здесь мы обращаемся к функции getchar для чтения отдельных знаков (кодов.) [2] Мы по-прежнему используем printf — для вывода кода символа в десятичной записи. [3]

С другой стороны, из условия корректности ввода исключается требование возврата именно EOF (как признака исчерпания входного потока), поскольку это условие уже является условием завершения главного цикла. Это различие связано с тем, что в данной программе не требуется опозновать «подходящий» ввод — допустимой является совершенно любая последовательность символов (кодов.) Напротив, в предыдущей программе мы принимали исключительно целые числа в десятичной записи.

Требование ложности значения функции признака ошибки ferror для стандартного ввода ( stdin ) по завершении главного цикла остается в силе. [4]

Подчеркнем, что диапазон возвращаемых функцией getchar значений — это диапазон «символьного» типа char плюс одно значение, а именно — признак конца потока EOF . [2] Как следствие, иногда встречаемое в примерах кода чтение символа из потока непосредственно в переменную типа char не вполне корректно — для этих целей следует всегда использовать переменную типа int .

Обратите внимание, что сформировать условие «конец потока» при вводе с клавиатуры можно вводом (в зависимости от системы и предполагая настройки по-умолчанию) Control-d или Control-z (также обозначаются C-d , ^D , C-z , ^Z .)

Похожие статьи