我有一个包含以下几行的输入流:
# <int> <int>
<some_data_type> <some_data_type> <some_data_type> ..... <some_data_type>
<some_data_type_1> <some_data_type_2> <some_data_type_3> <some_data_type_1> <some_data_type_2> <some_data_type_3> .... <some_data_type_1> <some_data_type_2> <some_data_type_3>
在上面的流中,所有三行都是不同的,并且必须以不同的方式解析。目前,我使用的阅读方法如下:
void reader( std::istream & is, DataStructure & d ){
std::string line;
getline(is,line);
std::stringstream s(line);
//parse line 1
getline(is,line);
std::stringstream line2(line);
//parse line 2
getline(is,line);
std::stringstream line3(line);
//parse line 3
}
现在的想法是根本不使用std::stringstream
,因为一行可以任意大,我们不想将所有内容两次加载到内存中。因此,如果可以从输入流中直接读取到用户给定的数据结构 d 中会更好。
一个想法是利用std::istream_iterator
但不幸的是不同的行有不同的解析需求。例如,在最后一行中,流中的三个元素一起构成了一个数据元素。
目前对我来说似乎合理的唯一想法是直接处理流缓冲区。如果有人可以推荐一种更好的方法,那就太好了。
注意:不能使用像std::stringstream
. 必须从流中直接读取到用户提供的数据结构中。
编辑:请注意,我们只允许通过文件一次。