作为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";
}
有没有办法简单地做到这一点(没有字符串解析器)?
答案 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') );