从文件中读取实数值和虚数值并使用C ++中的复杂类形成一个复杂变量

Kha*_*gdo -1 c++ complex-numbers

我有一个文本文件,用于存储复数的实部和虚部,在一个单独的列中一个接一个地存储。即。每个奇数条目都是真实的,每个偶数条目都是虚构的。我想读取这些值并使用c ++中的复杂类制作一个复数,但很难分配实部和虚部。

这是我的代码

#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;
}  
Run Code Online (Sandbox Code Playgroud)

我收到错误消息:左值必须作为赋值的左操作数。怎么做?

Ted*_*gmo 7

每个奇数条目都是真实的,每个偶数条目都是虚构的

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

您需要使用的二传手版本realimag

Complex_Signal[i].real(data);
Complex_Signal[i].imag(data);
Run Code Online (Sandbox Code Playgroud)

您也可以一次从文件中读取这两个文件(因为它们成对出现),并将它们同时放入数组中:

double real, imag;
while(fp_data >> real >> imag) {
    Complex_Signal[i] = {real, imag};
    ++i;
}
Run Code Online (Sandbox Code Playgroud)

while当你读取10个对,这样它会碰上循环但我们不终止未定义行为,如果你有在文件中超过10对。一种替代解决方案是使用a 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";
    }
}
Run Code Online (Sandbox Code Playgroud)