Будучи учеником с ++, я решил поиграть со сложными числами, используя стандартную библиотеку. Теперь мне нужно прочитать и написать массив сложных из / в текстовые файлы. Это работает просто для письма, без дополнительных уловок:
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";
}
Есть ли способ сделать это просто (без парсера строк)?
Если у вас есть 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') );
Версия 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;
}