2015-11-11 3 views
0

У меня есть переменные числа двоичных файлов (более 100). Каждый файл является огромным, но имеет точно такое же количество чисел с плавающей точкой (например, 1E8). Некоторые функции/операции будут применены к номерам с плавающей запятой с одним и тем же индексом среди файлов, например, 10-й номер в каждом файле.как читать несколько двоичных файлов в программе на C++ без использования библиотеки boost

Поскольку общий размер файлов большой, поэтому неэффективно сначала читать все файлы в памяти, а затем выполнять операцию. Вместо этого я хочу сделать это в режиме онлайн.

vector<string> file (nfiles, file_prefix); 
vector<shared_ptr<ifstream> > in; 
for(int g = 0; g < nfile; ++g){ 
    ostringstream fid; 
    fid << file_id[g]; 
    file[g] = file[g] + fid.str() + string(".bin"); 

    in.push_back(make_shared<ifstream> (file[g].c_str())); //how to specify ios::binary?? 
} 

vector<float> s(nfiles); 
for(int i = 0; i < nlines; ++i){ 
    for(int g = 0; g < nfiles; ++g){ 
    in[g].read((char*) s[g], sizeof(float)); 
    } 
    // do something with s 
} 

Код выше не работает, так как я не знаю, как определить ИОС :: Binary при создании потока для каждого файла. Он используется, чтобы показать, что я хочу. Кроме того, это зависит от библиотеки boost, которая не разрешается использовать в моем проекте. Я хочу изучить решение без использования boost.

Редактировать: в соответствии с комментариями в этой теме, я узнал, что повышение не требуется, даже если я использую make_shared. Я до сих пор не понимаю, почему я получил ошибку no matching function for call to 'make_shared' в строке in.push_back(...)

Edit: Ошибка компиляции из-за опечатки в моем коде. Итак, все мои вопросы в этом потоке решены.

+2

Вы имеете в виду, что это зависит от boost, из-за 'shared_ptr'? Тем временем это часть текущего стандарта. –

+0

@ πάνταῥεῖ Я имел в виду make_shared. –

+0

@HanZhang см. Std :: make_shared в helsinki

ответ

0

Поскольку ваша платформа OSX и std::make_shared поставляется с C++ 11, дайте ему попробовать, добавив --std=c++11 звенеть ++ Params.

2

std::make_shared<T> направляет свои аргументы соответствующим конструкторам.

gin.push_back(std::make_shared<ifstream> (gene_out[g].c_str(), std::ios::binary)); 

выше будет пересылать gene_out[g].c_str() и std::ios::binary в конструктор std::ifstream инициализации.

explicit ifstream (const char* filename, ios_base::openmode mode = ios_base::in); 
Смежные вопросы