![](/img/trans.png)
[英]C++ overload >> for ifstream on mac pointer being freed was not allocated
[英]Overload ifstream in c++
我試圖從一個文件中讀取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;
}
處理輸入時,您需要確保同時讀取“+”和“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 + 3i\n4 + 5i\n";
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 << "i\n";
}
}
這應該適合你:
#include <iostream>
#include <sstream>
int main(int argc, char *argv[])
{
std::istringstream s(
"2 + 3i\n"
"4 + 5i\n"
);
char sgn;
double r;
double i;
while(s >> r >> sgn >> i) {
if(s.get() != 'i') {
std::cerr << "Missing i\n";
return -1;
}
std::cout << r << sgn << i << "i\n";
}
return 0;
}
注意:虛部和尾部i之前的空格正在打破輸入。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.