C ++ cin char читает символ за символом - PullRequest
10 голосов
/ 06 октября 2011

Мне нужно читать символ за символом.Но я не знаю, как читать до конца ввода.В качестве примера система тестирования будет cin >> somecharvariable m раз.Я должен прочитать все символы за символом.Только м раз.Как я могу это сделать?

Ответы [ 3 ]

6 голосов
/ 06 октября 2011

Если вы хотите отформатированный ввод за символом, сделайте это:

char c;
while (infile >> c)
{
  // process character c
}

Если вы хотите прочитать необработанные байты, сделайте это:

char b;
while (infile.get(b))
// while(infile.read(&b, 1)   // alternative, compare and profile
{
  // process byte b
}

В любом случае infile должен иметь тип std::istream & или аналогичный, например, файл или std::cin.

5 голосов
/ 06 октября 2011

Есть несколько способов прочитать по одному символу за раз, пока вы не прочитаете их все, и ни один из них не обязательно является лучшим.

Лично я бы использовал следующий код:

char c;
while (cin.get(c)) {
    // Process c here.
}

Если вам нужно только прочитать m символов, рассмотрите возможность использования цикла for:

char c;
for (unsigned int i = 0; i < m && cin.get(c); ++i) {
    // Process c here.
}

Это запускает цикл, если выполняются два условия: (1) прочитано менее m символов и (2) есть еще символы для чтения.

Однако оба решения имеют недостаток: они относительно неэффективны. Более эффективно читать символы m за один раз.

Итак, сначала выделите достаточно большой буфер для хранения m символов, а затем попытайтесь прочитать их:

std::vector<char> buffer(m);
cin.read(&m[0], m);
unsigned total_read = cin.gcount();

Обратите внимание на последнюю строку - здесь будет указано, действительно ли прочитано m символов.

0 голосов
/ 06 октября 2011

Попробуйте это:

#include <iostream>
using std::cin;
using std::cout;

int main(int argc, char *argv[])
{
    char ch;
    unsigned m = 10;
    while (cin && m--) {
        cin.read(&ch, sizeof(ch));
        cout << ch;
    }
    return 0;
}
...