2016-10-04 4 views
0

Из потока и целого числа N, я должен получить целое число, представленное символами первой цифры N.Как читать из потока первые N цифр как целое число?

Вот некоторые примеры:

/*------------------------------------------------*/ 
/* N | Stream content  | Expected value */ 
/*-----|-------------------------|----------------*/ 
/* 2 | 123a52test    | 12 (int)  */ 
/* 2 | 123552a52test   | 12 (int)  */ 
/* 2 | 12test     | 12 (int)  */ 
/* 2 | 12      | 12 (int)  */ 
/* 4 | 123552a52test   | 1235 (int) */ 
/* 4 | 122a52test    | -error-  */ 

Есть ли прямое решение сделать такую ​​вещь, или я должен сделать следующее?

  1. Построить строку из N символов
  2. Создать stringstream и использовать его для извлечения целого числа
+0

Я не понимаю, почему вам нужно преобразовать из строки в 'int' вообще, если вам просто нужно отобразить значение. Просто убедитесь, что N первых цифр строки образуют действительный 'int' (single + или - в начале и только цифры). – NathanOliver

+0

Что такое * stream *? Это 'istream &'? – krzaq

+0

@NathanOliver Я не хочу отображать значение, мне нужно получить его как целое для дальнейшей обработки. – Silverspur

ответ

1

Eсть нет встроенного способа сделать это на C++. Однако вы можете «читать» ровно N символов, а затем превращать их в целые числа.

char number[N]; 
stream.read(number,N); 
return atoi(number); // or stringstream ss; ss << number; ss >> ret; return ret; 
+0

Если 'N' является константой' char number [N]; 'является незаконным в стандарте. – NathanOliver

+0

В моем случае 'N' не является константой, но я знаю максимальное значение' Nmax', которое может принимать, поэтому приведенное выше решение работает для меня с 'char number [Nmax]'. – Silverspur

+0

Не говоря уже о том, что он также работает с символом char * number = new char [N]; stream.read (число, Н); int retval = atoi (число); бесплатно (число) '. – LambdaBeta

0

вы можете использовать простой цикл, как это:

for (int i = 0; i < N; i++) { 
    if (isdigit(stream[N])) { 
     out*=10; 
     out+=stream[N] 
    } else { 
     err = 1; // error flag; 
     break; 
    } 
} 
Смежные вопросы