При вводе через getchar()
или getche()
в char
переменная, я обнаружил, что если я напишу строку как:
char a; a = getche(); // it returns char '\r' if pressed enter
a = getchar(); // it returns char '\n' if pressed enter
Во-первых, getche
- это функция POSIX из conio.h
, которая является нестандартной и не рекомендуется во всех основных наборах инструментов.
Это небуферизованная, неформатированная операция чтения. Когда ваш входной поток использует \r\n
для окончания строки (обычно в Windows), тогда вы читаете этот первый символ \r
.
Когда вы затем выполняете getchar()
, вы получаете второго персонажа, \n
. Это тоже функция C.
Остальная часть моего ответа будет о C ++.
Что на самом деле заставляет С ++ думать, что мы не будем предоставлять никакой информации
(то есть всегда \ n, что заставляет c ++ думать, что это конец ввода?).
Буферизованные функции ввода / вывода имеют тенденцию ограничивать чтение по \n
, да. В std::getline
имеется параметр, который позволяет изменить этот разделитель:
std::istream& std::getline(std::istream& is, std::string& str);
std::istream& std::getline(std::istream& is, std::string& str, char delim);
Но это всего лишь разделитель. Вы можете считать, что это означает «Конец строки», но это определенно не «Конец файла».
Во время чтения / записи файла (в котором заканчиваются некоторые строковые предложения
с \ n. тогда что, если строки заканчиваются нулевым символом, который также
представляет конец строки?).
Нулевые символы не имеют значения.
Единственная проблема, связанная с нулевыми символами, - это строки буфера в стиле C char
без дополнительной информации о длине. Единственный способ определить длину строки заключается в поиске завершающего нулевого символа (см .: strlen
), что проблематично, если в полезной части разбросаны произвольные другие нулевые символы данных.
Если вы передаете указатель на массив char
и его размер как int
, тогда он может содержать столько нулевых символов, сколько вам нужно.
При чтении символов из потока, в C или C ++, используемая вами функция сообщает, сколько символов было прочитано. Так что, даже если некоторые из них были нулевыми символами, это не имеет значения. Вы можете обращаться с ними так, как считаете нужным.
что символ представляет конец строки при записи / что символ представляет
конец ввода строки при чтении?
Я не совсем понял этот вопрос, но я завершу свой ответ кратким описанием End Of File.
Исторически файлы имели физический символ \004
(^D
), который находился в конце своего содержимого и представлял конец файла.
В настоящее время этот физический символ не используется таким образом, но внутренние компоненты ОС и файловой системы будут использовать различные механизмы для информирования вашего приложения о том, что больше нет ввода . Функции C возвращают макрос EOF
, а объекты C ++ имеют флаг состояния, который вы можете проверить.
Детали того, как именно это работает, отвлечены от вас; ты не должен заботиться об этом.
Интересно, что для завершения ввода в консоли Linux все равно нужно нажимать на клавиатуре ^D
.
Надеюсь, это вам чем-то помогло. Ваш вопрос не был особенно ясен, но вышеизложенное предназначено для краткого описания EOL и EOF в C ++.
Я могу порекомендовать эти книги и ресурсы для дальнейшего чтения.