Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Чтение больших файлов


Автор: Annuta 11.3.2013, 14:37
Привет!
Не кидайте камнями, не нашла я решения в инете.
Есть файл размером 7 Гб. fopen не работает. 
Способ с выделением памяти типа 
Код

buf = (unsigned char *)malloc(bufsize);
...
memset .. 

тоже не работает, нет столько памяти. Мне бы прочитать файл и разбить на куски по-меньше. 

Желательно с помощью fopen, но не обязательно.

Но как ? 



Автор: fish9370 11.3.2013, 14:46
Цитата(Annuta @  11.3.2013,  14:37 Найти цитируемый пост)
fopen не работает


а как fopen должен работать?


Цитата(Annuta @  11.3.2013,  14:37 Найти цитируемый пост)
Но как ? 


1) открываешь (fopen, open)
2) создаешь временный буфер (malloc, только не все 7 гигов)
3) открываешь второй файл куда будет производиться запись
4) читаешь блоками (fread, read)
5) пишешь (fwrite, write)
6) подсчитываешь размер записаной информации, повторяешь пункты 4-6, при достижении некоторого размера переходишь к пункту 7 (внешний цикл)
7) повторяем пункты 3-7, пока есть что читать

Автор: Annuta 11.3.2013, 14:59
fish9370, спасибоо за ответ.
Хорошо, разбить на куски поможет.
А в принципе - это единственный способ работать с такими объёмами ? 
Неужели человечество ничего не придумало лучше, чем всё поделить ? 


Автор: fish9370 11.3.2013, 15:10
Цитата(Annuta @  11.3.2013,  14:59 Найти цитируемый пост)
А в принципе - это единственный способ работать с такими объёмами ? 
Неужели человечество ничего не придумало лучше, чем всё поделить ? 


тебе надо задать себе следующие вопросы:
- у тебя в системе сколько физической памяти? 
- а оперционная система какой разрядности?

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

и потом, вся информация между операционной системой и блочным устройством (жесткий диск) передается блоками, такова архитектура - она зарекомендовала себя с хорошей стороны на протяжении десятков лет..

Автор: Annuta 11.3.2013, 16:53
Цитата(fish9370 @  11.3.2013,  14:46 Найти цитируемый пост)
1) открываешь (fopen, open)


Возвращает нулевой указатель после вызова fopen. Он не открывает файл вообще. (( 

Автор: feodorv 11.3.2013, 16:59
Цитата(Annuta @  11.3.2013,  17:53 Найти цитируемый пост)
Возвращает нулевой указатель после вызова fopen. Он не открывает файл вообще. (( 

Код

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main( void )
{
  FILE *stream = fopen( "somefile.ext", "rb");
  if( stream == NULL )
  {
    fprintf( stderr, "Can't open file: %s\n", strerror( errno ));
    return -1;
  }
  fclose( stream );
  return 0;
}


Добавлено через 2 минуты и 16 секунд
http://hashcode.ru/questions/83150/c-%D0%BA%D0%B0%D0%BA-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D1%82%D1%8C-%D1%81-%D0%B1%D0%BE%D0%BB%D1%8C%D1%88%D0%B8%D0%BC%D0%B8-%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%D0%BC%D0%B8

Автор: fish9370 11.3.2013, 17:16
да Анюта, действительно есть такая проблема (сам о ней не знал), поговаривают нужно просто прописать предварительно

Код

#define _FILE_OFFSET_BITS 64


или при сборке добавить 

Код

-D_FILE_OFFSET_BITS=64


мне так же интересно, откроет ли его системный вызов open, если не затруднит - попробуйте.. с параметром O_LARGEFILE

Автор: Annuta 12.3.2013, 11:11
fish9370, Спасибо за совет!
Код

#define _FILE_OFFSET_BITS 64

не помог, открыла и читала всё ofstream.

Ну а дальше куски по-меньше можно и fopen.


Спасибо за помощь! 


Автор: xvr 12.3.2013, 11:40
Цитата(Annuta @  11.3.2013,  14:59 Найти цитируемый пост)
А в принципе - это единственный способ работать с такими объёмами ? 

Можно мэпировать в память по кускам. Интерфейс зависит от ОС

Автор: bsa 12.3.2013, 15:04
Annuta, а зачем тебе делить на куски? Читай сразу через ifstream.

Автор: Earnest 14.3.2013, 08:57
ifstream где-то в глубине использует fopen или open... Раз ifstream открывает, то и open может, видимо.
Действительно, стримы уже сами по себе поддерживают буферизацию, так что зачем велосипед на коленке городить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)