Getline cin s c что это
Перейти к содержимому

Getline cin s c что это

  • автор:

Для чего лучше использовать getline, а для чего cin?

Основное отличие это, то что getline функция, а cin объект. Но как это влияет на использование?

  • Вопрос задан более трёх лет назад
  • 744 просмотра

Комментировать

Решения вопроса 0

Ответы на вопрос 2

Stalker31

getline для получения текста написанного до нажатия клавиши enter, cin для получения текста до первого пробела(то есть » » .

Ответ написан более трёх лет назад

Комментировать

Нравится 1 Комментировать

Getline cin s c что это

Hello, i’m taking a fundamental c++ course and a part of my newest assignment is asking me to read 100 characters from a file at a time without having any cut off words.

The professor wants me to use cin.getline() in my solution.
Unfortunately, I haven’t been able to successfully figure out how to use cin.getline() using the data from text file that was given. I can’t even get cin.getline() to work in general.

I don’t know how opposed this forum is to giving working examples, but I think it would help me the most to understand. This is just a small, but crucial, part of this assignment.

Thanks in advance for any response given!

closed account (48T7M4Gy)

I’ll give you two tips:

1. The tutorials on this site are very useful and self-help is often the quickest way to solving a problem even though these forums are available to everyone.

2. It is unlikely people will respond with working examples to your problem because the problem is not defined, you haven’t shown your attempts along with the sample data, and regrettably this is not a homework site.

But,
cin.getline is not consistent with your requirement that the information comes from a file instead of standard input (cin) This is a link to cin.getline with a sample. http://www.cplusplus.com/reference/istream/istream/getline/?kw=cin.getline

You might like to address what appears to be your problem by reading http://www.cplusplus.com/doc/tutorial/files/

> use cin.getline() using the data from text file that was given.

The simplest solution is to use redirection from the command line.
To read the contents of myfile.txt with std::cin use the command line:
./myprogram < myfile.txt
It works the same way in all command line processors.
unix sh and csh: http://sc.tamu.edu/help/general/unix/redirection.html
windows cmd: http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true

Here is an example:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 int main() < const std::size_t MAX_LINE_SZ = 8191 ; char line[MAX_LINE_SZ+1] ; // +1 for the terminating null character while( std::cin.getline( line, MAX_LINE_SZ ) ) // for each line read from stdin < // do something with the line: for example, print it normally and then print it in reverse std::cout '\n' ; // gcount(): number of characters that were read (including the null character at the end) auto pos = std::cin.gcount() - 1 ; // -1 because we don't want to print the null character at the end while( pos > 0 ) std::cout "\n\n" ; > >

From the command line:

clang++ -std=c++14 -stdlib=libc++ -O2 -Wall -Wextra -pedantic-errors -pthread main.cpp -lsupc++ -omyprogram ./myprogram < main.cpp

To do this from within the program (convenient if you are dead without an IDE to baby-sit over you):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 struct redirect_file_to_cin < redirect_file_to_cin( const char* file_name ) < fbuf.open( file_name, std::ios::in ) ; // open file for input oldbuf = std::cin.rdbuf( std::addressof(fbuf) ) ; // redirect file to std::cin > ~redirect_file_to_cin() < std::cin.rdbuf(oldbuf) ; >// not copyable or assignable redirect_file_to_cin( const redirect_file_to_cin& ) = delete ; void operator= ( const redirect_file_to_cin& ) = delete ; std::filebuf fbuf ; std::streambuf* oldbuf ; >; int main() < redirect_file_to_cin redirector( __FILE__ ) ; // redirect this file to std::cin const std::size_t MAX_LINE_SZ = 8191 ; char line[MAX_LINE_SZ+1] ; // +1 for the terminating null character while( std::cin.getline( line, MAX_LINE_SZ ) ) < // do something with the line: for example, print it normally and then print it in reverse std::cout '\n' ; // gcount(): number of characters that were read (including the null character at the end) auto pos = std::cin.gcount() - 1 ; // -1 because we dobn't want to print the null character at the end while( pos > 0 ) std::cout "\n\n" ; > >

Как работает getline()?

Задача очень проста: на вход поступает количество принимаемых строк, и затем сами строки. На выход должно выйти (через пробел) количество гласных в этих строках.

// Подсчет гласных в строке #include #include #include #include using namespace std; class count_predicate < public: bool operator()(const char& expr) < if ( expr == 'a' || expr == 'o' || expr == 'i' || expr == 'u' || expr == 'y' || expr == 'e' ) return true; return false; >>; int main() < int N; // Нужное количество строк cin >> N; string strs[N]; for (int i = 0; i < N; i++) getline(cin, strs[i]); for (int i = 0; i < N; i++) < int n = count_if(strs[i].begin(), strs[i].end(), count_predicate()); cout return 0; > 

Когда вместо getline() я использую обычный cin>> , то все работает, но строки попадаются с пробелами, поэтому гласные считаются некорректно. Здесь же почему-то getline() каким-то образом "перебивает" cin сверху, и считывает количество строк как еще одну строку, как я понял из теста программы (но это не точно). Собственно, почему так происходит? И еще, у меня такое ощущение, что я решаю задачу очень топорно, есть ли какое-то более элегантное решение?
Особенно меня смущает количество проверок в предикате. Если такое решение есть, можно и без STL, ей я пользуюсь исключительно в учебных целях, закрепляю, так сказать, пройденный материал.

Отслеживать

219k 15 15 золотых знаков 120 120 серебряных знаков 230 230 бронзовых знаков

getline в C++: чтение строки

Привет! В этой статье мы поговорим о функции std::getline из стандартной библиотеки C++. Эта функция позволяет нам прочитать строку из любого потока ввода.

Начнем мы с рассмотрения разных вариантов использования этой функции. Потом посмотрим на ошибки, которые эта функция может вернуть, а закончим упражнениями, которые помогут закрепить изученный материал.

Иллюстрация getline в C++

Чтение строки из потока при помощи getline

getline является частью заголовочного файла . У этой функции есть два варианта:

istream& getline (istream& is, string& str); istream& getline (istream& is, string& str, char delim);

Эта функция читает поток is до тех пор, пока не встретит разделительный символ. По умолчанию, это символ переноса строки \n , но мы можем указать любой другой передав delim .

Сохраняет прочитанное getline в аргумент str типа std::string , который мы передаем ей в качестве второго аргумента. Все, что хранилось в строке, будет перезаписано прочитанным из потока ввода is .

Возвращает функция поток, из которого была прочитана строка: первый параметр is .

Давайте посмотрим на пример использования функции getline :

#include using namespace std; int main()  string input; getline(cin, input); cout  <"input = \""   <"\""  ; return 0; > 
чтение до конца строки input = "чтение до конца строки"

В этом простом примере мы прочитали из стандартного ввода первую строку. В данном случае это "чтение до конца строки" .

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

#include using namespace std; int main()  string input; getline(cin, input, ';'); cout  <"input = \""   <"\""  ; return 0; >
первая часть; вторая часть input = "первая часть"

Тут мы добавили третий аргумент - ';' . Поэтому мы получили только то, что было до точки с запятой.

Мы также можем прочитать несколько строк одним вызовом getline :

первая часть; input = "первая часть"

Тут getline продолжил чтение, даже после того, как первая строка закончилась, и началась вторая.

В каком случае следующая программа выведет строку “Прочитано успешно”?

#include #include #include using namespace std; int main()  string input; ifstream file("text.txt"); getline(file, input, '*'); if(input == "test") cout  <"Прочитано успешно"  ; else cout  <"Ошибка чтения"  ; return 0; >

Предполагаем, что файл text.txt существует и может быть прочитан. Каким содержимым должен обладать text.txt ?

test*продолжение файла

getline в данном случае читает из файла до тех пор, пока не встретит символ * . Для того чтобы условие if(input == "test") было истинным, строка перед символом * должна быть именно "test" .

В примерах выше мы считывали строку из стандартного ввода. Однако getline позволяет нам читать с любого потока. Давайте теперь попробуем считать строку из файла.

Чтение из файла при помощи getline

Поскольку getline может читать из любого потока ввода, давайте воспользуемся классом ifstream для чтения из файла:

#include #include using namespace std; int main()  ifstream shows_file("shows.txt"); string show; getline(shows_file, show); cout  <"show = \""   <"\""  ; return 0; >
Rick and Morty Stranger Things Game of Thrones
show = "Rick and Morty"

В программе выше мы поменяли первый аргумент функции getline с cin (поток стандартного ввода) на shows_file (поток ввода из файла).

Использование цикла while с getline

Зачем нам останавливаться на первом шоу? Давайте прочитаем все строки, которые есть в файле shows.txt. Для этого можно воспользоваться циклом while :

#include #include using namespace std; int main()  ifstream shows_file("shows.txt"); string show; while (getline(shows_file, show))  cout  <"show = \""   <"\""  ; > return 0; >
Rick and Morty Stranger Things Game of Thrones 
show = "Rick and Morty" show = "Stranger Things" show = "Game of Thrones"

Как вы можете видеть, для чтения всего файла достаточно использовать возвращаемое значение getline в условии цикла while . Так можно сделать, потому что в ifstream реализован оператор конвертации в bool .

При конвертации в bool , ifstream возвращает true если можно продолжить чтение, false если нельзя:

cout  "can read: "  (bool)shows_file  endl; while (getline(shows_file, show))  cout  "show = \""  show  "\""  endl; > cout  "can read: "  (bool)shows_file  endl;

Тут мы только добавили конвертацию в bool до и после цикла. Вывод программы:

can read: 1 show = "Rick and Morty" show = "Stranger Things" show = "Game of Thrones" can read: 0

Ожидаемо, мы не можем продолжить чтение после “Game of Thrones” (в файле после этого больше ничего нет).

Ошибки при работе с getline

При работе с потоками ввода всегда могут произойти ошибки. Для того, чтобы понять, что произошло, можно воспользоваться флагами на потоке ввода:

  1. stream.good() : возвращает true если все прошло без ошибок.
  2. stream.eof() : поток ввода

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *