我有一个包含两个重载operator>>
方法的Complex类,一个用于来自控制台的std::istream
,另一个用于std::ifstream
。
std::istream& operator>>(std::istream& is, Complex& c)
{
int re, im;
std::cout << "input the real-part of the complex" << std::endl;
while ( ! (is >> re))
{
std::cout << "Please give me a double! Try again: \n";
is.clear();
is.ignore(1000, '\n');
}
std::cout << "input the imaginary-part of the complex" << std::endl;
while ( ! (is >> im))
{
std::cout << "Please give me a double! Try again: \n";
is.clear();
is.ignore(1000, '\n');
}
c = Complex(re, im);
return is;
}
std::ifstream& operator>>(std::ifstream& ifs, Complex& c)
{
int re, im;
ifs >> re; ifs>> im;
c = Complex(re,im);
return ifs;
}
在我的程序中,我能够从控制台或文件中插入复数数组。为了简化插入,我创建了其他方法:
void insertArray(std::istream& is, Complex* arr, int size)
{
for (int i = 0; i < size; ++i)
{
is >> arr[i];
}
}
不幸的是,我注意到当使用std::ifstream
对象作为参数调用此方法时,
std::ifstream ifs("complex.dat");
insertArray(ifs, x, size);
两个运营商&gt;&gt;调用方法,以便控制台包含其他输出,但是从文件中正确加载数据。结果显示在图像中。
很容易注意到程序要求给定值,因为控制台缓冲区如何从文件缓冲区加载数据。
有没有办法处理它,除了用insertArray2
而不是std::ifstream
创建单独的方法std::istream
?
答案 0 :(得分:2)
您可以考虑模板化insertArray
:
template<class T>
void insertArray(T& is, Complex* arr, int size)
答案 1 :(得分:2)
如果我理解你的问题,你可以写:
if ( &is == &std::cin )
std::cout << "Please give me a double! Try again: \n";
只有在使用std::cin
调用函数时才会生成此输出。如果您在不同的fstream
或sstream
或其他任何地方使用该功能,则不会这样做。