从文件中读取实值和虚值并在 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

这与您的代码不符。它首先具有实数部分(偶数)。我假设您的代码做了正确的事情。

您需要使用 realimag 的 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";
    }
}