Вам просто нужно согласовать использование "cin >>" и "getline", когда вы хотите читать в строке. Их поведение немного отличается.
Помните, что при использовании cin
для чтения с консоли каждое нажатие пользователем клавиши попадает в буфер cin
, включая \ n для клавиши возврата .
Таким образом, когда ваш пользователь вводит слово «read» и нажимает «return», чтобы ввести свой выбор, содержимое cin
в этот момент:
чтения \ п
Тогда вы делаете:
string choice;
cin >> choice;
Проблема в том, что оператор >>
определен для чтения до тех пор, пока не достигнет пробела, поэтому он будет читать в режиме "чтение", но он оставит \ n все еще сидеть в буфере cin.
Итак, после вашего заявления cin >> choice
содержимое cin
будет:
\ п
Тогда вы идете, чтобы сделать это:
char filename[size];
cout<<"Enter the name of the file you want to read \n";
cin.getline(filename, size);
Проблема здесь в том, что оператор >>
определен для чтения до пробела (например, \ n), но getline
определен для чтения до тех пор, пока не достигнет \ n, и будет читать все до тех пор, пока он не увидит \ n , а затем прочитает \ n и отбросит его.
Хорошо, ваша проблема в том, что когда вы переходите к своему выражению cin.getline(filename,size)
, в буфере cin
все еще остается символ \ n, поэтому getline
сразу видит \ n и отбрасывает его, сохраняя пустую строку в filename
.
У вас есть несколько вариантов здесь.
Если вы указали имя файла в виде строки и изменили имя файла на:
cin >> filename;
Он будет работать правильно, потому что оператор >>
также игнорирует начальные пробелы.
Вы также можете изменить начальное чтение choice
, чтобы оно было таким (используя getline
из заголовка строки здесь):
string choice;
getline(cin,choice);
И это будет работать, потому что getline
не оставит беспризорный символ \ n, сидящий в буфере cin
.
Вы можете использовать функцию cin.ignore
для очистки буфера cin
. Вы не хотите просто слепо использовать ignore
, если вы не знаете, что делаете, но в этом случае мы знаем, что вы оставляете паразит \ n на cin
, поэтому, если вы хотите получить избавиться от этого, вы можете сделать это:
#include <limits>
string choice;
cin >> choice;
cin.ignore(std::numeric_limits<int>::max(),'\n');
Этот оператор ignore
, по сути, стирает оставшиеся данные в cin
, говоря: «отбросьте следующие символы INT_MAX или все, вплоть до \ n.» *
Надеюсь, что прояснит, что происходит для вас.