Как читать из std :: cin до конца потока? - PullRequest
2 голосов
/ 23 ноября 2011

Моя проблема в том, что я хочу прочитать входные данные из std::cin, но не знаю, как долго они вводятся. Также я должен char и не могу использовать std::string. Есть два способа, которыми я должен справиться: а) Пользователь вводит текст, и когда он нажимает [ENTER], программа прекращает чтение. б) Пользователь перенаправляет std::cin в файл (например, .\a.oput < file), который может содержать несколько строк.

Редактировать: Только что заметил, что std :: cin.eof () всегда ложно и в случае чтения из файла.

Для а) Я мог читать, пока не произойдет \ n. Для б) Редактировать: Нет (я мог читать, пока не произойдет std :: cin.eof ().) Но когда я не знаю, возникает ли у меня проблема с а) или б), как я могу прервать процесс чтения?

Это то, что у меня есть для) ...

char buffer = ' ';
while(std::cin >> std::noskipws >> buffer && buffer != '\n')
{
    // do some stuff with buffer
}

... и б)

char buffer = ' ';
while(std::cin >> std::noskipws >> buffer)
{
    // do some stuff with buffer
}

Также я знаю, что есть std::cin.tellg() для получения текущей позиции в потоке.

Редактировать: Таким образом, похоже, что в случае файла входные потоки прерываются, как std::cin >> std::noskipws >> buffer получает false. Что код выше делает для):

  • Он ожидает, когда пользователь сделает ввод и нажмет [ENTER]
  • Затем он просматривает каждый символ, введенный пользователем в последней строке.
  • Затем пользователь снова ждет ввода и нажимает [ENTER]
  • Бесконечно ожидания обработки петли

Так как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 23 ноября 2011

Вы могли бы потребовать, чтобы ввод всегда заканчивал EOF (имеется в виду от командной строки, требующей нажатия ^D), а затем использовал процесс для b как всегда. Это затем включит многострочный ввод из cmdline

0 голосов
/ 23 ноября 2011

Вы можете использовать (старую) функцию getline , которая берет указатель на массив символов и может использовать разделитель.Но вы не сможете гарантировать, что в каждом случае он будет читать eof (так как буфер char может быть слишком маленьким), но использование массива char и игнорирование его размера очень опасно (и отточка безопасности катастрофическая) вещь в любом случае, поскольку это может привести к переполнениям буфера , которые могут быть легко использованы.

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

char buffer[256];
while(getline(buffer,256,'\n')) { //get a line
   /* do something with the line */
}

Это чтобы прочитать максимальное количество символов:

char buffer[256];
while(getline(buffer,256)) {//get a maximum amount out of the input
   /* do something with the line */
}
...