Как прочитать массив комплексных чисел из текстового файла в Stack Overflow

Будучи учеником с ++, я решил поиграть со сложными числами, используя стандартную библиотеку. Теперь мне нужно прочитать и написать массив сложных из / в текстовые файлы. Это работает просто для письма, без дополнительных уловок:

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

Есть ли способ сделать это просто (без парсера строк)?

1

Решение

Если у вас есть 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') );
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;
}
4

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector