从文件中读取实值和虚值并在 C++ 中使用复数 class 形成复数变量
Reading real & imaginary values from file & forming a complex variable using complex class in c++
我有一个文本文件,它存储复数的实部和虚部,一个接一个地存储在一个列中。 IE。每个奇数条目都是真实的,每个偶数条目都是虚构的。我想读取这些值并在 C++ 中使用复数 class 生成复数,但难以分配实部和虚部。
这是我的代码
#include <iostream>
#include <complex>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
ifstream fp_data;
int i=0;
double data=0;
complex<double> Complex_Signal[10];
fp_data.open("Complex_data.txt");
if (!fp_data)
{
cout << "Unable to open file" << endl;
exit(1); // terminate with error
}
while (fp_data >> data)
{
switch(i%2)
{
case 0: Complex_Signal[i].real() = data;
break;
case 1: Complex_Signal[i].imag() = data;
break;
}
i++;
}
fp_data.close();
for(i=0; i<10; i++)
{
cout << Complex_Signal[i] << endl;
}
return 0;
}
我收到 错误:需要左值作为赋值的左操作数。怎么做?
对集合数据使用正确的public成员函数:
...
switch(i%2)
{
case 0: Complex_Signal[i].real(data);
break;
case 1: Complex_Signal[i].imag(data);
break;
}
...
参见:http://www.cplusplus.com/reference/complex/complex/imag/ and http://www.cplusplus.com/reference/complex/complex/real/
Every odd entry is real, every even entry is imaginary
这与您的代码不符。它首先具有实数部分(偶数)。我假设您的代码做了正确的事情。
您需要使用 real
和 imag
的 setter 版本:
Complex_Signal[i].real(data);
Complex_Signal[i].imag(data);
您也可以同时从文件中读取两者(因为它们成对出现)并同时将它们放入数组中:
double real, imag;
while(fp_data >> real >> imag) {
Complex_Signal[i] = {real, imag};
++i;
}
你的 while
循环不会在你读取 10 对时终止,所以如果你有超过 10 对,它会 运行 进入 未定义的行为 在文件中。另一种解决方案是使用 std::vector
来读取文件中实际拥有的尽可能多的对。
#include <complex>
#include <fstream>
#include <iostream>
#include <vector>
// using namespace std; // bad practise
int main() {
std::vector<std::complex<double>> Complex_Signal;
if(std::ifstream fp_data{"Complex_data.txt"}) {
double real, imag;
while(fp_data >> real >> imag) {
Complex_Signal.emplace_back(real, imag);
}
} else {
std::cerr << "Unable to open file\n";
return 1;
}
for(auto& sig : Complex_Signal) {
std::cout << sig << "\n";
}
}
我有一个文本文件,它存储复数的实部和虚部,一个接一个地存储在一个列中。 IE。每个奇数条目都是真实的,每个偶数条目都是虚构的。我想读取这些值并在 C++ 中使用复数 class 生成复数,但难以分配实部和虚部。
这是我的代码
#include <iostream>
#include <complex>
#include <cstdlib>
#include <fstream>
using namespace std;
int main()
{
ifstream fp_data;
int i=0;
double data=0;
complex<double> Complex_Signal[10];
fp_data.open("Complex_data.txt");
if (!fp_data)
{
cout << "Unable to open file" << endl;
exit(1); // terminate with error
}
while (fp_data >> data)
{
switch(i%2)
{
case 0: Complex_Signal[i].real() = data;
break;
case 1: Complex_Signal[i].imag() = data;
break;
}
i++;
}
fp_data.close();
for(i=0; i<10; i++)
{
cout << Complex_Signal[i] << endl;
}
return 0;
}
我收到 错误:需要左值作为赋值的左操作数。怎么做?
对集合数据使用正确的public成员函数:
...
switch(i%2)
{
case 0: Complex_Signal[i].real(data);
break;
case 1: Complex_Signal[i].imag(data);
break;
}
...
参见:http://www.cplusplus.com/reference/complex/complex/imag/ and http://www.cplusplus.com/reference/complex/complex/real/
Every odd entry is real, every even entry is imaginary
这与您的代码不符。它首先具有实数部分(偶数)。我假设您的代码做了正确的事情。
您需要使用 real
和 imag
的 setter 版本:
Complex_Signal[i].real(data);
Complex_Signal[i].imag(data);
您也可以同时从文件中读取两者(因为它们成对出现)并同时将它们放入数组中:
double real, imag;
while(fp_data >> real >> imag) {
Complex_Signal[i] = {real, imag};
++i;
}
你的 while
循环不会在你读取 10 对时终止,所以如果你有超过 10 对,它会 运行 进入 未定义的行为 在文件中。另一种解决方案是使用 std::vector
来读取文件中实际拥有的尽可能多的对。
#include <complex>
#include <fstream>
#include <iostream>
#include <vector>
// using namespace std; // bad practise
int main() {
std::vector<std::complex<double>> Complex_Signal;
if(std::ifstream fp_data{"Complex_data.txt"}) {
double real, imag;
while(fp_data >> real >> imag) {
Complex_Signal.emplace_back(real, imag);
}
} else {
std::cerr << "Unable to open file\n";
return 1;
}
for(auto& sig : Complex_Signal) {
std::cout << sig << "\n";
}
}