Как читать необработанный ввод в cpp - PullRequest
0 голосов
/ 15 декабря 2018

Представьте себе, что я хочу скопировать и вставить некоторый текст в stdin, и я хочу полностью прочитать его в cpp (включая пробелы).Как мне это сделать?Если я использую cin, он читает токены, разделенные пробелами.Если я сделаю:

string text
string s;
while(cin>>s){
    text += s;
}

, тогда он становится неразличимым, был ли это пробел ("") или символ новой строки ("\ n") между токенами.Вопрос в том, как прочитать всю строку.

Ответы [ 3 ]

0 голосов
/ 16 декабря 2018

Чтобы сделать результат предоставленного подхода циклическим, различимым, мне пришлось прочитать его с readline() следующим образом:

string text
string s;
while(readline(cin,s)){
    text += s + "\n";
}

Таким образом, гарантируется, что readline будет читать всю строку (спробелы) и данные токены будут разделяться только "\ n" (который может быть добавлен вручную).

0 голосов
/ 16 декабря 2018

От cplusplusreference.com:

Как объект класса istream, символы могут быть извлечены либо как отформатированные данные, используя оператор извлечения (оператор >>), либо как неформатированные данные, используя функции-члены, такие каккак прочитано.

cin - C ++ Ссылка

Я получаю:

#include <iostream>
#include <string>

using std::string;
using std::cin;
using std::cout;
using std::endl;

int main()
{
    char c;
    string text;

    while (!cin.read(&c, 1).eof())
        s += c;

    cout << "string was " << s << endl;
}

В Windows завершите его с помощьюна отдельной строке, за которой следует .Я проверил его, и он действительно содержит символы конца строки.

0 голосов
/ 16 декабря 2018

Если вы хотите, чтобы что-то быстро кодировалось, используйте std::istream::getc.

std::string text;
char c;
while ( std::cin.getc(c) )
{
   text.push_back(c);
}

Если вы ожидаете, что содержимое stdin будет большим, это будет проблемой производительности,Вам следует рассмотреть возможность использования std::istream::read для таких случаев использования.

...