你会想要使用
bigint& array
通过引用获取值(或者您不可能将读取的数字插入其中)。
此外,您将要使用
char ch;
in >> ch;
而不是in << get()
(不编译)。更好的是,添加错误处理:
if (!(in >> ch))
{
// we're in trouble (in.rdstate(), in.eof(), in.fail() or in.bad() to know more)
}
如果你想使用in.get()
,你应该准备好跳过你自己的空格(包括换行符)。我更喜欢std::istream_iterator
这里,因为它会自动这样做(如果std::ios::skipws
标志有效,默认情况下是这样)。
所以这是一个简单的方法(主要假设输入数据是有效的并且空白可忽略):
#include <vector>
#include <istream>
#include <iterator>
struct bigint
{
std::vector<char> v; // or whatever representation you use (binary? bcd?)
};
std::istream& operator>>(std::istream& in, bigint& array)
{
for (std::istream_iterator<char> f(in), l; f != l; ++f) {
if (*f>='0' && *f<='9')
array.v.push_back(*f - '0');
else if (*f==';')
break;
else
throw "invalid input";
}
return in;
}
#include <iostream>
#include <sstream>
int main()
{
std::istringstream iss(
"10000000000000000000000000000000000345;\n"
"299793000000\n"
"00000000000000000000067;\n"
"4208574289572473098273498723475;\n"
"28375039287459832728745982734509872340985729384750928734590827098752938723;\n"
"99999999; 99999999;\n");
bigint value;
while (value.v.clear(), iss >> value)
std::cout << "read " << value.v.size() << " digits\n";
}
在 Coliru 上看到它