что такое getline в c
C For Dummies Blog
The latest and most trendy function for reading a string of text is getline(). It’s a new C library function, having appeared around 2010 or so.
You might not have heard of the getline() function, and a few C programmers avoid it because it uses — brace yourself — pointers! Even so, it’s a good line-input function, and something you should be familiar with, even if you don’t plan on using it.
Here’s a typical getline() statement:
The getline() function is prototyped in the stdio.h header file. Here are the three arguments:
&buffer is the address of the first character position where the input string will be stored. It’s not the base address of the buffer, but of the first character in the buffer. This pointer type (a pointer-pointer or the ** thing) causes massive confusion.
&size is the address of the variable that holds the size of the input buffer, another pointer.
stdin is the input file handle. So you could use getline() to read a line of text from a file, but when stdin is specified, standard input is read.
Here’s a sample program:
Lines 9 and 10 use the size_t variable type, which is a special type of integer. That’s required by the getline() function. The buffer size is 32 characters, which is set at Line 9. It must be referenced as a pointer, not a literal value.
In this code, 32 bytes of storage are assigned to memory location buffer via the malloc() function at Line 12. Lines 13 through 17 handle the (rare) condition when memory isn’t available. Odds are low that would happen in this program, but it’s good programming practice to check.
Because variable characters is a size_t variable type, the %zu placeholder is used in the printf() function at Line 21.
Here’s a sample run:
Notice anything annoying with the output?
Yep, as with the fgets() function, getline() reads and stores the newline character as part of the string. So if the pointer thing bothers you, just use fgets() instead.
Finally, if you’re curious, you can use getline() with array notation for the storage buffer. It ain’t pretty, but it works:
To get the ** type of pointer from array notation, you need to declare a pointer variable and assign it to the array, which is done above in Line 8. You can then use that pointer with the ampersand in the getline() function, shown above at Line 13.
Copyright © 1997-2021 by QPBC.
All rights reserved
std:: getline
Compiler support | ||||
Freestanding and hosted | ||||
Language | ||||
Standard library headers | ||||
Named requirements | ||||
Feature test macros (C++20) | ||||
Language support library | ||||
Concepts library (C++20) | ||||
Diagnostics library | ||||
General utilities library | ||||
Strings library | ||||
Containers library | ||||
Iterators library | ||||
Ranges library (C++20) | ||||
Algorithms library | ||||
Numerics library | ||||
Localizations library | ||||
Input/output library | ||||
Filesystem library (C++17) | ||||
Regular expressions library (C++11) | ||||
Atomic operations library (C++11) | ||||
Thread support library (C++11) | ||||
Technical specifications | ||||
Symbols index | ||||
External libraries |
std:: basic_istream CharT,Traits > & getline ( std:: basic_istream CharT,Traits > & input,
std:: basic_string CharT,Traits,Allocator > & str,
std:: basic_istream CharT,Traits > & getline ( std:: basic_istream CharT,Traits > && input,
std:: basic_string CharT,Traits,Allocator > & str,
getline reads characters from an input stream and places them into a string:
Contents
[edit] Parameters
input | — | the stream to get data from |
str | — | the string to put the data into |
delim | — | the delimiter character |
[edit] Return value
[edit] Notes
When consuming whitespace-delimited input (e.g. int n ; std:: cin >> n ; ) any whitespace that follows, including a newline character, will be left on the input stream. Then when switching to line-oriented input, the first line retrieved with getline will be just that whitespace. In the likely case that this is unwanted behaviour, possible solutions include:
[edit] Example
The following example demonstrates how to use getline function to read user’s input and how to process file line by line.
Функции-члены потока ввода
Функции — члены потока ввода используются для дисковых операций ввода.
открыт
Если используется входной поток файлов ( ifstream ), необходимо связать этот поток с конкретным файлом диска. Это можно сделать в конструкторе или можно использовать open функцию. В любом случае аргументы одни и те же.
При открытии файла, связанного с входным потоком, обычно указывается флаг ios_base:: OpenMode (режим по умолчанию — ios::in ). Список openmode флагов см. в разделе ios_base:: OpenMode. Флаги могут быть объединены с помощью побитового оператора OR (|).
Чтобы прочитать файл, сначала используйте функцию- fail член, чтобы определить, существует ли она:
Получить
Неформатированная get функция элемента работает как >> оператор с двумя исключениями. Во-первых, get функция включает пробелы, в то время как средство извлечения исключает пробелы при skipws установке флага (по умолчанию). Во-вторых, эта get функция менее вероятно приведет к тому, что связанный поток вывода ( cout например,) будет сброшен.
Вариант get функции указывает адрес буфера и максимальное число считываемых символов. Это полезно для ограничения количества символов, отправленных в конкретную переменную, как показано в примере:
Входные данные
Пример выходных данных
getline
getline Функция-член аналогична get функции. Обе функции допускают третий аргумент, который указывает завершающий символ для входных данных. Значение по умолчанию — символ новой строки. Обе функции резервируют один символ для необходимого завершающего символа. Однако get оставляет завершающий символ в потоке и getline удаляет завершающий символ.
В следующем примере задается завершающий символ для потока ввода:
Входные данные
Просмотр
Этот пример считывает двоичную запись из файла заработной платы в структуру:
Программа предполагает, что записи данных форматируются точно так же, как указано в структуре, без завершающего возврата каретки или символов перевода строки.
функции seekg и tellg
Чтобы использовать seekg для реализации систем управления данными, ориентированных на записи, умножьте размер записи фиксированной длины на номер записи, чтобы получить координату байта относительно конца файла, а затем используйте get объект для чтения записи.
выхода
close Функция члена закрывает файл диска, связанный с входным файлом потока, и освобождает файл операционной системы. ifstream Деструктор закрывает файл, но функцию можно использовать, close Если необходимо открыть другой файл для того же объекта потока.
Русские Блоги
Использование C ++ функции getline ()
Функция getline () является относительно распространенной
Первый: в есть две перегруженные формы функции getline ():
Функция такова: считывание до n символов (включая конечные теги) из istream и сохранение их в массиве, соответствующем s. Даже если вы не прочитали достаточно n символов,
Если встречается разделитель или число слов достигает предела, чтение прекращается, и разделитель не будет сохранен в массив, соответствующий s.
* Код изменен по ограничению слова и настройке терминатора
Второй тип: в есть четыре перегруженные формы функции getline:
istream& getline (istream&& is, string& str);
Использование аналогично предыдущему, но чтение istream передается в функцию в качестве параметра. Считанная строка сохраняется в строке типа string.
is: указывает входной поток, такой как cin.
str: ссылка типа String, используемая для хранения информации о потоке во входном потоке.
delim: переменная типа char, установленный символ усечения, без пользовательской настройки при обнаружении without \ n ’ввод прекращается.
(EOF предназначен для различения допустимых данных и входного терминатора на языке Си.
Вход EOF заблокирован системой. Это ctrl + z под windows и ctrl + d под linux / unix. )
(1) До конца файла, (2) Обнаружен разделитель функции, (3) Вход достигает максимума.
Функция getline () используется как условное суждение в while.
Вы обнаружите, что обычный ввод во время выполнения не может выпрыгнуть из цикла, и иногда могут возникать необъяснимые ошибки. Но что именно вызвало это? Давайте проанализируем это ниже:
Затем, когда мы вводим «Вы прекрасны! # Мистер Линг», но действительным является «Вы прекрасны!», Содержимое после # не сохраняется. Результаты выполнения программы следующие:
Если вы установите здесь «#» в качестве терминатора, это не повлияет на повторный ввод «\ n». Содержимое до # будет выводиться как обычно. Например:
// ввод: // ввод с помощью ‘\ n’
// Вывод: // Все еще вывод
Посредством небольшого примера функции getline (), что произойдет с функцией getline () как оператором while!
Просто проанализируйте время (getline (cin, line))
(Примечание. Здесь символ возврата каретки по умолчанию прекращает чтение. Нажмите Ctrl + Z (Windows) (Ctrl + D (Linux)) или введите EOF (см. MSDN), чтобы вернуться для выхода из цикла.
В этом предложении объектом истинного суждения предложения суждения while является состояние cin, то есть существует ли в настоящее время действительный входной поток.
Входной поток является объектом, и состояние, возвращаемое потоком, оценивается. Таким образом, при нормальных обстоятельствах, независимо от того, как вы печатаете, вы не можете выпрыгнуть из его цикла.
Среди них некоторые товарищи могут ошибочно думать, что объект суждения оператора while суждение является строкой (то есть является ли строка пустой).
Возврат каретки и установленный символ завершения завершают операцию чтения функции getline (). Но оператор while суждение оценивает, является ли входной поток функции getline () допустимым. Так!
std:: getline (string)
Extracts characters from is and stores them into str until the delimitation character delim is found (or the newline character, '\n', for (2)).
The extraction also stops if the end of file is reached in is or if some other error occurs during the input operation.
If the delimiter is found, it is extracted and discarded (i.e. it is not stored and the next input operation will begin after it).
Note that any content in str before the call is replaced by the newly extracted sequence.
Each extracted character is appended to the string as if its member push_back was called.
Parameters
Return Value
The same as parameter is.
A call to this function may set any of the internal state flags of is if:
flag | error |
---|---|
eofbit | The end of the source of characters is reached during its operations. |
failbit | The input obtained could not be interpreted as a valid textual representation of an object of this type. In this case, distr preserves the parameters and internal data it had before the call. Notice that some eofbit cases will also set failbit. |
badbit | An error other than the above happened. |
(see ios_base::iostate for more info on these)
Additionally, in any of these cases, if the appropriate flag has been set with is‘s member function ios::exceptions, an exception of type ios_base::failure is thrown.