如何从C ++中的文本文件中读取复数的数组

时间:2013-10-24 08:31:28

标签: c++ arrays complex-numbers

作为c ++的学习者,我决定使用标准库来复杂数字。现在我需要读取和编写一个复杂的文本文件数组。这只是为了写作,没有补充技巧:

void dump(const char *filename){
  ofstream result;
  result.open (filename);
  for(int k=0;k<15;k++){
    result<< outputs[k] <<endl;
  }
  result.close();
}

数据是括号并逐行写的,如下所示:(真实,即时通讯......)

现在,我想阅读(并加载一个复杂的数组)应该与阅读一样简单。然而,尽管我的研究,我还没有找到正确的方法。

我的第一次尝试是天真的:

void readfile(const char *filename){
  string line;
  ifstream myfile (filename);
  if (myfile.is_open())
  {
    int k=0;
    while ( getline (myfile,line) ){
      k++;
      cout << line << endl;
      inputs[k]= (complex<float>) line; //naive !
    }
    myfile.close();
  }
  else cout << "Unable to open file"; 
}

有没有办法简单地做到这一点(没有字符串解析器)?

2 个答案:

答案 0 :(得分:4)

C ++版本:

std::complex<int> c;
std::ifstream fin("filename");
fin>>c;

C版:

int a,b;
FILE *fin=fopen("filename","r");
fscanf(fin,"(%d,%d)\n",&a,&b);

C ++读取每行上有多个复杂值的多行

#include <stdio.h>
#include <fstream>
#include <complex>
 #include <iostream>
 #include <sstream>
int main ()
{
    std::complex<int> c;
    std::ifstream fin("test.in");
    std::string line;
    std::vector<std::complex<int> > vec;
    vec.reserve(10000000);
    while(std::getline(fin,line))
    {
        std::stringstream stream(line);
        while(stream>>c)
        {
           vec.push_back(c);
        }
    }

    return 0;
}

答案 1 :(得分:4)

假设您operator<< your_complex_type(如上所述,std::complex提供一个),您可以使用istream_iterator

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
    std::ifstream input( "numbers.txt" );
    std::vector<your_complex_type> buffer{
            std::istream_iterator<your_complex_type>(input), 
            std::istream_iterator<your_complex_type>() };
}

这将读取文件中的所有数字并将其存储在std::vector<your_complex_type>

修改您的评论

如果您知道预先阅读的元素数量,可以按如下方式对其进行优化:

#include <fstream>
#include <iterator>
#include <vector>

int main()
{
    std::ifstream input( "numbers.txt" );
    std::vector<your_complex_type> buffer;
    buffer.reserve(expected_number_of_entries);

    std::copy(std::istream_iterator<your_complex_type>(input), 
              std::istream_iterator<your_complex_type>(),
              std::back_inserter(buffer));
}

std::vector::reserve将使向量保留足够的内存来存储指定数量的元素。这将删除不必要的重新分配。

您也可以使用类似的代码将您的数字写入文件:

std::vector<your_complex_type> numbers; // assume this is filled
std::ofstream output{ "numbers.txt" };

std::copy(std::begin(numbers), std::end(numbers),
          std::ostream_iterator<your_complex_type>(output, '\n') );