我正试图从一个看起来像这样的文件中读取形式x + y* I的复数:
2 + 3i
4 + 5i
如果我像这样实现它,它只适用于第一行,我希望能够以同样的方式再次读取第二行。什么好主意吗?
istream& operator>>(istream& in, Complex& c) {
in >> c.r >> c.i;
return in;
}
编辑:不要直接抛出异常,因为这不是iostreams通常的处理方式。
编辑:单独处理符号字符,以便允许输入中的空格。
一个快速而肮脏的解决方案:
istream& operator>>(istream& in, Complex& c)
{
char sign;
char suffix;
in >> c.r >> sign >> c.i >> suffix;
if ((sign != '+' && sign != '-') || suffix != 'i') {
in.setstate(ios::failbit);
}
if (sign == '-') {
c.i = -c.i;
}
return in;
}
您需要确保在处理输入时同时读取"+"one_answers"i"。
下面的实现可以工作:
struct complex
{
double r;
double i;
};
std::istream& operator>>(std::istream& in, complex& c)
{
char plus, i;
in >> c.r >> plus >> c.i >> i;
return in;
}
std::string initdata = "2 + 3in4 + 5in";
int main()
{
std::stringstream ss(initdata);
std::vector<complex> values;
std::istream_iterator<complex> begin(ss), end;
std::copy(begin, end, std::back_inserter<std::vector<complex>>(values));
}
我会这样做:
#include <iostream>
struct complex
{
int r, i;
};
int main ()
{
complex co;
char c;
while ((std::cin >> co.r >> c /* '+' */ >> co.i >> c /* 'i' */))
{
std::cout << co.r << ' ' << co.i << "in";
}
}
这应该可以为您工作:
#include <iostream>
#include <sstream>
int main(int argc, char *argv[])
{
std::istringstream s(
"2 + 3in"
"4 + 5in"
);
char sgn;
double r;
double i;
while(s >> r >> sgn >> i) {
if(s.get() != 'i') {
std::cerr << "Missing in";
return -1;
}
std::cout << r << sgn << i << "in";
}
return 0;
}
注意:虚数部分前的空格和后面的i将打断输入