1

C++ の学習者として、標準ライブラリを使用して複素数を扱うことにしました。ここで、テキスト ファイルとの間で複雑な配列を読み書きする必要があります。これは、補足的なトリックなしで、単に書くだけで機能します:

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

データは括弧で囲まれ、次のように行ごとに書き込まれます: (real,im)...

さて、読み取り (および複合体の配列のロード) は、読み取りと同じくらい簡単なはずだと思います。しかし、私の研究にもかかわらず、私はそれを行う正しい方法を見つけていません。

私の最初の試みは素朴でした:

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"; 
}

それを簡単に(文字列パーサーなしで)行う方法はありますか?

4

2 に答える 2

4

operator<<forがあると仮定すると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') );
于 2013-10-24T09:19:33.453 に答える
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;
}
于 2013-10-24T08:36:06.500 に答える