io — чтение чисел с помощью getChar () в переполнении стека

Я хотел бы сделать функцию чтения целых чисел из stdin в кратчайшие сроки. Чтобы быть более конкретным, у меня есть очень длинная последовательность ints разделены пробелами с EOF на котором я должен сделать некоторые операции. я использовал cin но так как эта функция достаточно надежна в своих возможностях, я бы хотел сделать что-то меньшее, более конкретное и, следовательно, более быстрое и эффективное. Я читал, что быстрый способ чтения stdin является getChar() функция. Я уже нашел несколько реализаций этой проблемы в C, но у символов есть просто другая форма целых чисел, а в C ++ — нет. Моя идея состоит в том, чтобы сделать функцию типа bool

bool myIntRead( int *num);

который в основном читал бы символы целого числа до «пробела» и каким-то образом возвращал эти символы в int число. bool тип будет использоваться для информирования о том, что stdin пустой.

int main() {
int num;
while (myIntRead(&num) ) {
myIntRead(&num)
//some operations on num
}
}

Я полностью осознаю, что такого рода работа со входом намного сложнее и сложнее, но мне бы очень хотелось найти решение этой проблемы. Я действительно буду признателен вам за помощь в определении этой концепции.
С наилучшими пожеланиями!

0

Решение

Если вы хотите иметь дело только с вводом ASCII и уверены, что ввод будет предоставлен вам в ожидаемом формате (т. Е. Цифры 0-9 следуют за пробелом), тогда все, что вам нужно сделать, это прочитать каждый символ и затем:

  • Определите, если это пробел или цифра
  • Если это пробел, начните читать новый номер
  • Если это цифра, добавьте цифру к текущему номеру.

Следующее иллюстрирует это. Но он не обрабатывает переполнение и не имеет условия остановки.

int c;
int current_number;
std::vector<int> numbers;do {
c = getchar();

if(c == 0x20)                      // it's a space
{
numbers.push_back(current_number);    // add the current number to the list of numbers
current_number = 0;                   // reset the current_number variable back to 0
}else if(c >= 0x30 && c <= 0x39)   // it's a digit
{
current_number = current_number * 10 + (c - 0x30);   // add next digit..
// you may want to deal with overflow here (ie. if number of digits > MAX_DIGITS or similar)
}

} while (TRUE);           // there should be a stop condition here..
0

Другие решения

следующий код читает 1000000 (один миллион) чисел за 61 мс (обычный компьютер несколько лет). Файл имеет размер 3,8 МБ.

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>

template< typename T, typename Out >
struct IntReader_type
{
IntReader_type( Out out ) : out_( out ) {}
template< typename E, typename Traits >
friend std::basic_istream< E, Traits >& operator>>( std::basic_istream< E, Traits >& in, IntReader_type rdr )
{
std::basic_istream< E, Traits >::sentry ok( in );
if( ok )
{
std::ios_base::iostate state = std::ios_base::goodbit;
try
{
const std::ctype< E >& ct = std::use_facet< std::ctype< E > >( in.getloc() );
while( state == std::ios_base::goodbit )
{
T result = T(0);
for( Traits::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() )
{
if( Traits::eq_int_type( m,  Traits::eof() ) )
{
state |= std::ios_base::eofbit; // EOF is not an error
break;
}
const E c = Traits::to_char_type( m );
if( ct.is( std::ctype_base::space, c ) )
break;
if( ct.is( std::ctype_base::digit, c ) )
{
(result *= 10) += T(c - E('0'));
}
else
{
state |= std::ios_base::failbit; // not a digit
break;
}
}
*(rdr.out_)++ = result; // store the number
// skip white space character
for( Traits::int_type m = in.rdbuf()->sgetc(); ; m = in.rdbuf()->snextc() )
{
if( Traits::eq_int_type( m,  Traits::eof() ) )
{
state |= std::ios_base::eofbit;
break;
}
if( !ct.is( std::ctype_base::space, Traits::to_char_type( m ) ) )
break;
}
}
}
catch( ... )
{
state |= std::ios_base::badbit;
if( in.exceptions() & std::ios_base::badbit )
throw;
}
in.setstate( state );
}
return in;
}
private:
Out out_;
};
template< typename T, typename Out >
IntReader_type< T, Out > read_ints( Out out )
{
return IntReader_type< T, Out >( out );
}

вызвать Integer-reader следующим образом:

vector< int > numbers;
if( cin >> read_ints< int >( back_inserter(numbers) ) )
{   // read is done without error

будьте осторожны — в этой версии могут быть прочитаны только числа без знака, и нет проверки переполнения целых чисел.

0

Итак c = getchar();

Вы должны хранить в массиве, чтобы он был пригоден для обработки.

Если c содержит одну цифру, умножить c [0] * 1.

Если c содержит две цифры, умноженные на c [1] * 1 + c [0] * 10.

Если c содержит три цифры, умноженные на c [2] * 1 + c [1] * 10 + c [0] * 100.

Если c содержит четыре цифры, умножить c [3] * 1 + c [2] * 10 + c [1] * 100 + c [0] * 1000 и т. д. и т. д.

Код для ввода выглядит так:

   while(digitInput!=13)
{
if (kbhit())
{
digitInput=getch();
if (digitInput==27) exit(0);

if ((digitInput>47) && (digitInput<59))
{
digitArray[digit]=(unsigned char)digitInput-48;
digit++;

printf("%d",digitInput-48);

}
if (digitInput==13)  { digitn=digitArray[0]; break; }
}
}switch(digit)
{
case 0:
case 1:
digitn=digitArray[0]*1 ;
break;

case 2:
digitn= digitArray[1]*1  +digitArray[0]*10  ;
break;

case 3:
digitn=  digitArray[2]*1+digitArray[1]*10 +digitArray[0]*100  ;
break;

case 4:
digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
break;
}

Полное приложение в коде.

#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>int digit=0,digitInput=0;
int digitArray[10]={0},digitn;
int numberOfInputDigits=4;

/*********************************
*                               *
********************************/

void getIntKey(void)
{
digitArray[0]=0;
digitArray[1]=0;
digit=0;
digitInput=0;

while(digitInput!=13)
{
if (kbhit())
{
digitInput=getch();
if (digitInput==27) exit(0);

if ((digitInput>47) && (digitInput<59))
{
digitArray[digit]=(unsigned char)digitInput-48;
digit++;

printf("%d",digitInput-48);

}
if (digitInput==13)  { digitn=digitArray[0]; break; }
}
}

switch(digit)
{
case 0:
case 1:
digitn=digitArray[0]*1 ;
break;

case 2:
digitn= digitArray[1]*1  +digitArray[0]*10  ;
break;

case 3:
digitn=  digitArray[2]*1+digitArray[1]*10 +digitArray[0]*100  ;
break;

case 4:
digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
break;

case 5:
digitn=digitArray[4]*1+digitArray[3]*10+digitArray[2]*100+digitArray[1]*1000+digitArray[0]*10000 ;
break;

case 6:
digitn=digitArray[5]*1+digitArray[4]*10+digitArray[3]*100+digitArray[2]*1000+digitArray[1]*10000
+digitArray[0]*100000;
break;case 7:
digitn=digitArray[6]*1+digitArray[5]*10+digitArray[4]*100+digitArray[3]*1000+digitArray[2]*10000
+digitArray[1]*100000 +digitArray[0]*1000000;
break;case 8:
digitn=digitArray[7]*1+digitArray[6]*10+digitArray[5]*100+digitArray[4]*1000+digitArray[3]*10000
+digitArray[2]*100000 +digitArray[1]*1000000+digitArray[0]*10000000;
break;

case 9:
digitn=digitArray[8]*1+digitArray[7]*10+digitArray[6]*100+digitArray[5]*1000+digitArray[4]*10000
+digitArray[3]*100000 +digitArray[2]*1000000+digitArray[1]*10000000 +digitArray[0]*100000000;
break;}// if (digitInput!=13)  digitn=digitArray[3]*1+digitArray[2]*10+digitArray[1]*100+digitArray[0]*1000 ;
printf("\n%i\n\n",digitn);
}

/*********************************
*                               *
********************************/

int main()
{
system("color 1F");     //Blue background
printf("Digits Into decimal numbers \n ");
printf("Max Input is %d Digits   \n ",numberOfInputDigits);
printf("\nInput Digit >");
getIntKey();

printf("\nThe input was   digitArray[7]=%d \n",digitArray[7]);

printf("digitArray[6]=%d \n",digitArray[6]);
printf("digitArray[5]=%d \n",digitArray[5]);
printf("digitArray[4]=%d \n",digitArray[4]);

printf("digitArray[3]=%d \n",digitArray[3]);
printf("digitArray[2]=%d \n",digitArray[2]);
printf("digitArray[1]=%d \n",digitArray[1]);
printf("digitArray[0]=%d \n",digitArray[0]);
printf("\n%i\n\n",digitn);return 0;
}
-1
По вопросам рекламы [email protected]