C ++ Cin не получил строку

У меня есть программа, в которой я указываю файл для чтения с помощью cin, поэтому я запускаю программу ./prog < file.txt, но в следующем коде cin ничего не захватывает. Может кто-нибудь объяснить, почему после выполнения кода строка пуста?

 void Building::build(){
char mode;
cin >> mode >> sizeFloors >> numFloors;

if(mode == 'M')
readMap(sizeFloors, numFloors);

}

^^ это хорошо работает

void Building::readMap(int floorSize, int numFloors){

string line;
int curFloor(numFloors - 1);

while( curFloor >= 0 ){
cin >> line;

if(line.empty()){
cout << "Error: input file too short" << endl;
exit(1);
}
}

^^ здесь line.empty () возвращает true

это входной файл

M
4
1
WWWW
WWWW
WWWW
WWWW

так ясно, строка не должна возвращаться пустой

1

Решение

При смешивании форматированного ввода (т. Е. С использованием operator>>()) и неформатированный ввод (например, std::getline()) вам нужно убедиться, что вы находитесь в интересующем вас месте. Отформатированные операторы ввода перестают читать, как только их формат удовлетворен. Например, чтение символа просто читает этот символ. Любые последующие символы, например, новая строка, остаются на входе. std::getline() перестает читать на первой полученной новой строке. Я думаю, после того, как вы вошли в ваш выбор меню, вы нажмете на новую строку, и это где std::getline() останавливается (то же самое, если пункт меню находится в отдельном файле).

Типичный подход при переключении между форматированным и неформатированным вводом / выводом состоит в пропуске всех начальных пробелов:

std::getline(std::cin >> std::ws, line);

Кроме того, вы можете игнорировать все, вплоть до первой новой строки:

std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

Какой подход используется явно зависит от содержания ваших данных. Например, если вы хотите прочитать код, в котором главное пространство имен имеет значение, переход к первому непробельному пространству не является идеей, отмеченной наградами. Однако во многих ситуациях std::ws работает просто отлично.

3

Другие решения

Это может помочь вам …

// reading a text file
#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () {
string line;
ifstream myfile ("example.txt");
if (myfile.is_open())
{
while ( myfile.good() )
{
getline (myfile,line);
cout << line << endl;
}
myfile.close();
}

else cout << "Unable to open file";

return 0;
}
2

>> оператор, когда читает std::string принимает пробелы в качестве разделителя строк, см. Вот.

Вы можете использовать GetLine вместо.

И вы можете (например, в Linux) скомпилировать свой код со всеми предупреждениями и информацией отладки (например, с g++ -Wall -g) затем используйте отладчик (например, gdb) чтобы узнать, что происходит.

Я бы предложил line.clear() внутри петли.

Я также нахожу написание int curFloor(numFloors - 1); менее читабельно, чем int curFloor = numFloors - 1;

-1
По вопросам рекламы [email protected]