У меня есть программа, в которой я указываю файл для чтения с помощью 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
так ясно, строка не должна возвращаться пустой
При смешивании форматированного ввода (т. Е. С использованием 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
работает просто отлично.
Это может помочь вам …
// 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;
}
>>
оператор, когда читает std::string
принимает пробелы в качестве разделителя строк, см. Вот.
Вы можете использовать GetLine вместо.
И вы можете (например, в Linux) скомпилировать свой код со всеми предупреждениями и информацией отладки (например, с g++ -Wall -g
) затем используйте отладчик (например, gdb
) чтобы узнать, что происходит.
Я бы предложил line.clear()
внутри петли.
Я также нахожу написание int curFloor(numFloors - 1);
менее читабельно, чем int curFloor = numFloors - 1;