Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Чтение больших файлов 
V
    Опции темы
Annuta
Дата 11.3.2013, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



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

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

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

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

Но как ? 



--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
fish9370
Дата 11.3.2013, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



Цитата(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, пока есть что читать


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Annuta
Дата 11.3.2013, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



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


--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
fish9370
Дата 11.3.2013, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



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


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

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

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


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Annuta
Дата 11.3.2013, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



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


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

--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
feodorv
Дата 11.3.2013, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(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 секунд
Как работать с большими файлами


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
fish9370
Дата 11.3.2013, 17:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 663
Регистрация: 15.4.2007
Где: Москва

Репутация: -1
Всего: 1



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

Код

#define _FILE_OFFSET_BITS 64


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

Код

-D_FILE_OFFSET_BITS=64


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

Это сообщение отредактировал(а) fish9370 - 11.3.2013, 17:18


--------------------
undefined
PM MAIL WWW ICQ   Вверх
Annuta
Дата 12.3.2013, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 3.10.2006
Где: Dubna

Репутация: нет
Всего: 1



fish9370, Спасибо за совет!
Код

#define _FILE_OFFSET_BITS 64

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

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


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


--------------------
Программист - это комбинация лени и логики !
PM MAIL   Вверх
xvr
Дата 12.3.2013, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 60
Всего: 223



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

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

PM MAIL   Вверх
bsa
Дата 12.3.2013, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Annuta, а зачем тебе делить на куски? Читай сразу через ifstream.
PM   Вверх
Earnest
Дата 14.3.2013, 08:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



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


--------------------
...
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.