在c++中使用getChar()读取数字
Reading numbers with getChar() in C++
我想让一个函数以最快的方式从stdin
读取整数。更具体地说,我有一个很长的int
序列,用空格隔开,最后是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
}
}
我完全意识到这种处理输入的方式要复杂得多,难度也大得多,但我真的很想找到解决这个问题的方法。我将非常感谢你们在找到这个概念的实现方面的一些帮助。最好的问候!
如果你只想处理ASCII输入,并且你确信输入将以预期的格式提供给你(即。数字0-9后面跟着b空格)那么你所要做的就是读取每个字符,然后:
- 确定是空格还是数字
- 如果是空格,开始读取新的数字
- 如果是数字,在当前数字后面加一个数字
下面举例说明。但是它不处理任何溢出,也没有停止条件。
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..
下面的代码在61ms内读取1000000(一百万)个数字(正常的PC机已经使用了几年)。文件大小为3.8MB。
#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 );
}
以这种方式调用整型阅读器:
vector< int > numbers;
if( cin >> read_ints< int >( back_inserter(numbers) ) )
{ // read is done without error
要小心-在这个版本中只能读取无符号数,并且没有整数溢出检查
ok,那么c = getchar();
你必须把它存储在一个数组中才能被处理。
如果c
包含1位数字,则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%inn",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%inn",digitn);
return 0;
}
- 如何从保存在 Java 中C++的字节数组中读取数字?
- 从文本文件中的每一行读取数字,并计算数字重复的次数
- 如何从文件中读取数字并在数组中使用它们?
- 使用模板化函数从CSV文件中读取数字
- 根据数字在 c++ 中作为矩阵的位置从文件中读取数字
- 如何从文件中读取数字序列?
- 如何允许我的程序成功读取数字包含的文件
- 如何仅从C 中的文本文件中读取数字
- 从没有分隔符 C++ 的文件读取数字出现次数
- 读取数字并转换为单词
- 从文件,特定行中仅读取数字
- 从TextFile中读取数字,并检查它们是否在范围内
- C 从文本文件中读取数字,忽略注释
- 从文件读取数字列表到动态数组
- 我正在尝试从文件中读取数字
- 从txt文件中读取数字,添加一些数字,然后在c ++中将其重写为其他文件
- C++如何从文件中读取数字并将其分配到数组中的相应位置
- 读取数字的文本文件,并存储在C++的整数数组中
- 从文件中读取数字
- 从文本中读取数字并输出平均值