2016-09-24 3 views
2

Каков самый простой способ прочитать 10-битный двоичный файл и проанализировать каждый байт, не прибегая к использованию более высоких библиотек?Итерировать более 10 ГБ + двоичный файл

Его настолько запутанным с потоками, файлы, отображенные на память файлы и т.д.

я буквально просто хочу что-то вроде:

char* buffer = read(filename, binary); 

while(buffer != EOF){ 
    //Read byte 
    ++buffer; 
} 

Performance имеет значение просто из-за размера файла.

+0

Что случилось с std :: ifstream? –

+0

Для простых кусков я всегда возвращаюсь к C и небуферизованной обработке FILE *. – Lothar

+2

Файл с отображением памяти является лучшим. – Jichao

ответ

1

Если вы хотите хорошую производительность последовательного доступа (чтение с самого начала по отношению к конец), использование fread(). Вы можете хранить FILE* в std::shared_ptr для RAII:

std::shared_ptr<FILE> file(fopen(...), fclose); 

Вы можете игнорировать C++ потоки, отображенные на память файлы, подталкивание и т.д. Ничего из этого не будет работать быстрее, чем fread().

+7

* «Ничто из этого не будет быстрее, чем' fread() '" * - Нам нужны доказательства для этого типа [ipsedixitism] (https://en.wikipedia.org/wiki/Ipse_dixit). Есть некоторые цифры, чтобы поддержать ваше заявление? – WhiZTiM

+1

@WhiZTiM: Я много раз тестировал эти вещи. Любой, кто хочет быть на 100% уверенным в своем конкретном случае использования на своей конкретной платформе, может написать свои собственные тесты. –

0

Как вы не связаны с производительностью,
простой в то время как петля с ifstream может извлечь один байт за один раз:

#include <iostream> 
#include <fstream> 

int main(){ 

    std::ifstream infile("file.txt"); 

    while (infile){ 

    //get next byte 
    char c; 
    infile.get(c); 

    //process byte 
    std::cout << c; 
    } 

} 
+1

Несомненно, вы не будете читать входной файл объемом 10 ГБ по одному байту за раз. –

+0

@JohnZwinck Почему бы и нет? Код, который делает фактический ввод-вывод для вас, лучше знает и будет читать фрагменты эффективного размера по мере необходимости, если вы явно не скажете, чтобы это не делалось. Я могу представить множество приложений, которые потребуют чтения байта байтом. –

+1

@CareyGregory нет ни одного, который «требовал» его. – xaxxon

Смежные вопросы