Форум программистов, компьютерный форум CyberForum.ru

Размер и выделение памяти под открытие файла. - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.82
KorPaEv
 Аватар для KorPaEv
53 / 29 / 2
Регистрация: 08.07.2011
Сообщений: 171
09.09.2011, 10:36     Размер и выделение памяти под открытие файла. #1
Всем привет.
Уважаемые знатоки, вопрос в следующем)

Значит задача такая, есть некий файл бинарный.
Размер не известный (компилятору). Я его открываю, читаю все что там есть и вывожу на экран.
Подскажите как определить размер этого файла и запихать все что там есть в буфер, который как раз будет динамическим (расширяемым в зависимости от размера файла)?
Ну а затем вывести все это на экран.
Привожу свой код ниже (буфер определяю статическим). Мне это не нужно.
P.S. В перспективе данные файла будут подаваться в реалтайме, поэтому по этому вопросу буду рад выслушать на будущее советы.
Пишу на C++, работаю с потоками поэтому fopen, seeks и т.д мне тоже не нужно.

Код.

Код
#include <fstream>
#include <iostream>

using namespace std;

const unsigned int buf_size = 0x4000; //вот тут задаю сам буфер

int main()
    {
		char *buffer;

        ifstream f_op("text", ios::binary);
        if (!f_op)
            cerr<<"Error file open";
        else
            cout<<"File open!!! Text this file:\n";

		buffer=new char(buf_size);

        while (!f_op.eof())
            {
            f_op.read((char *)buffer, 1); //читаю по одному байту, тоже плохо какие идеи? В идеале мне читать надо блочно по 4 байта например, для скорости обработки текста.
            cout<<*buffer;
            }
        f_op.close();

		delete buffer;
    }
Добавлено через 3 часа 22 минуты
Неужели нет никаких идей ни у кого?((
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.09.2011, 10:36     Размер и выделение памяти под открытие файла.
Посмотрите здесь:

C++ выделение памяти под переменную
Выделение памяти под масссив C++
Выделение памяти под матрицу C++
выделение памяти под wchar_t C++
C++ Выделение памяти под структуры
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Vladimir.
155 / 155 / 10
Регистрация: 24.11.2009
Сообщений: 375
09.09.2011, 10:44     Размер и выделение памяти под открытие файла. #2
Подскажите как определить размер этого файла
можно воспользоваться функцией stat() (объявлена в sys/stat.h). При вызове функции заполняется структура, которая содержит поле st_size - размер фаила в байтах.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 10:59     Размер и выделение памяти под открытие файла. #3
C++
1
2
3
4
5
6
7
8
  ifstream in;
  in.open ("name.txt", ios::binary );
  
  in.seekg (0, ios::end); // Позиционируемся в конец файла
  size_t length = in.tellg(); // Узнаём позицию (= длина файла)
  in.seekg (0, ios::beg); // Позиционируемся обратно в начало
 
  buffer = new char [length];
-=ЮрА=-
Заблокирован
Автор FAQ
09.09.2011, 11:03     Размер и выделение памяти под открытие файла. #4
Цитата Сообщение от KorPaEv Посмотреть сообщение
Неужели нет никаких идей ни у кого?((
C++
1
2
3
4
5
6
7
8
9
ifstream f_op("text", ios::binary);
f_op.seekg(0,ios::end);//курсор вконец
long fLen = f_op.tellg();//получили позицию курсора, она равна длинне файла
f_op.seekg(0,ios::beg);//курсор вначало
 
char * str = new char[fLen + 1];//Буфер в размер файла
f_op.read(str,fLen);//Прочли весь файл в буфер
f_op.close()
str[fLen] = '\0';//Вконце строк всегда идёт мусор, отбрасываем его
Далее делай с str всё что хочешь...

Добавлено через 41 секунду
Блин опоздал...
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 11:07     Размер и выделение памяти под открытие файла. #5
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Блин опоздал...
А ещё и с потенциальной ошибкой. Файл может быть больше 4Гигабайт.
Впрочем и у меня с ошибкой. Я наивно предположил, что sizeof(size_t) == sizeof(pos_type).
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 12:36     Размер и выделение памяти под открытие файла. #6
KorPaEv, если файл over 4Gb, то у вас будут проблемы с выделением такого буфера. На 32-х системах это в принципе невозможно, на 64-х ещё такую память достать надо. Читайте порционно в небольшой буфер (4 Кб, например).

Добавлено через 5 минут
Не знаю на счёт pos_type, но старый добрый сишный fpos_t может учитывать огромные файлы (у меня определён как long long). Получается через ftell( FILE*, fpos_t* ). Но это ТСу, к сожалению, не подойдёт.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:41     Размер и выделение памяти под открытие файла. #7
Цитата Сообщение от talis Посмотреть сообщение
Не знаю на счёт pos_type
С pos_type проблемы нет. Проблема есть с size_t, которую я использовал.

Цитата Сообщение от talis Посмотреть сообщение
Читайте порционно в небольшой буфер (4 Кб, например)
100% поддерживаю. Только буфер 64К, это минимальный считываемый блок с HDD, если я ничего не путаю.
KorPaEv
 Аватар для KorPaEv
53 / 29 / 2
Регистрация: 08.07.2011
Сообщений: 171
09.09.2011, 12:42  [ТС]     Размер и выделение памяти под открытие файла. #8
ВСЕМ СПАСИБО ЗА ОТВЕТЫ! Не успел пораньше заглянуть и закончил сам))), все сделал так же...
Код
#include <fstream> //подключаем заголовок для работы с потоками ввода вывода
#include <iostream>

using namespace std;

int main()
    {
        //резервируем место под буфер
		char *buffer;
		//длинна файла
        int len_file;

        //поток на чтение из файла с параметром бинарника
        ifstream f_op;

        //открываем файл данных для чтения и проверяем открылся ли он
        f_op.open("text", ios::binary);
        if (!f_op)
            cerr<<"Error file open";
        else
            cout<<"File open!!! Text this file:\n";

        //ставлю курсор на конец файла без смещение (0)
        f_op.seekg(0, ios::end);
        //вычисляю кол-во байт до установленного курсора
        len_file=f_op.tellg();
        //помещаю курсор вначало файла
        f_op.seekg(0, ios::beg);

        //заводим массив вычисленной длинны файла
        buffer=new char [len_file];

        //читаю из буфера всю длинну файла
        f_op.read(buffer, len_file);
        //вывожу на экран буфер
        cout<<buffer;

        //закрываю файл
        f_op.close();

        //чистим память
		delete [] buffer;
		return 0;
    }
А по поводу чтения по 4 байта блочно не совсем еще понял, можно поподробнее?
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 12:45     Размер и выделение памяти под открытие файла. #9
KorPaEv, вы в игры играете? На жёстком есть образ DVD хотя бы одной игры (желательно больше 2 Gb)? Хотя в вашем случае с int и образа mini-CD хватит, упокой Господь их души. Попробуйте прочитать такой здоровый файл вашей прогой.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:46     Размер и выделение памяти под открытие файла. #10
Цитата Сообщение от KorPaEv Посмотреть сообщение
А по поводу чтения по 4 байта блочно не совсем еще понял, можно поподробнее?
Ты не можешь создать массив размером более, чем есть свободной памяти (на самом деле, она ещё должна быть непрерывной, поэтому всё ещё хуже).
Можешь попробовать считать какой-нибудь большой файл (видео, например) и программа упадёт из-за невозможности выделить столько памяти.
Поэтому нужно считывать файл по частям и обрабатывать его содержимое последовательно, блоками.
KorPaEv
 Аватар для KorPaEv
53 / 29 / 2
Регистрация: 08.07.2011
Сообщений: 171
09.09.2011, 12:50  [ТС]     Размер и выделение памяти под открытие файла. #11
Цитата Сообщение от talis Посмотреть сообщение
KorPaEv, вы в игры играете? На жёстком есть образ DVD хотя бы одной игры (желательно больше 2 Gb)? Хотя в вашем случае с int и образа mini-CD хватит, упокой Господь их души. Попробуйте прочитать такой здоровый файл вашей прогой.
Поправьте, если ошибаюсь. Читать надо блочно? Создаю константу буфера фиксированного размера - 4 байта и соответственно в цикле прогоняю все 2 Gb, по 4 байта в буфер? согласен повиснем надолго...

Тогда как поступить? Или я не понимаю чего то?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
09.09.2011, 12:52     Размер и выделение памяти под открытие файла. #12
Цитата Сообщение от KorPaEv Посмотреть сообщение
по 4 байта в буфер?
Килобайта.))))

В буфер такого размера, на который точно хватит памяти. Мегабайт, десять, пятдесят. Но не стопицот.
KorPaEv
 Аватар для KorPaEv
53 / 29 / 2
Регистрация: 08.07.2011
Сообщений: 171
09.09.2011, 12:56  [ТС]     Размер и выделение памяти под открытие файла. #13
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ты не можешь создать массив размером более, чем есть свободной памяти (на самом деле, она ещё должна быть непрерывной, поэтому всё ещё хуже).
Можешь попробовать считать какой-нибудь большой файл (видео, например) и программа упадёт из-за невозможности выделить столько памяти.
Поэтому нужно считывать файл по частям и обрабатывать его содержимое последовательно, блоками.
Продублирую пост. Создаю константу буффер фиксированного размера 4 байта. В нее помечаю считанное. Тогда один момент не понятен, где будет храниться все данные файла? если мне нужно получить доступ скажем к средней его части? циклом считывать слишком медленно. Сам уже запутался короче(

Добавлено через 1 минуту
Цитата Сообщение от Deviaphan Посмотреть сообщение
Килобайта.))))

В буфер такого размера, на который точно хватит памяти. Мегабайт, десять, пятдесят. Но не стопицот.
Да)) деревянный еще, туплю)
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
09.09.2011, 13:00     Размер и выделение памяти под открытие файла. #14
Цитата Сообщение от KorPaEv Посмотреть сообщение
если мне нужно получить доступ скажем к средней его части?
загружаете среднюю часть в буфер

Добавлено через 10 секунд
ifstream::seekg()

Добавлено через 1 минуту
вообще, если вы решите, что вам нужно получить доступ к данным по определённому адресу в файле, значит, у вас есть некие данные, которые говорят, что вон по тому адресу лежит то, что тебе нужно. читаете подобную информацию в структуры
-=ЮрА=-
Заблокирован
Автор FAQ
09.09.2011, 16:15     Размер и выделение памяти под открытие файла. #15
Цитата Сообщение от KorPaEv Посмотреть сообщение
ВСЕМ СПАСИБО ЗА ОТВЕТЫ! Не успел пораньше заглянуть и закончил сам))), все сделал так же...

А по поводу чтения по 4 байта блочно не совсем еще понял, можно поподробнее?
Если данных у тебя много в консоль их сразу cout не выведешь, делай постепенный вывод
аля

C++
1
2
3
4
5
6
7
for(int i = 0,j; i < len_file;i += 4096)
{
   for(j = 0; j < 4096; j++)
        cout<<buffer[j];
   cout<<"\r\n";
   buffer += 4096;//Сдвигаем указатель на 4096
}
- как раз по 4кБ выводить будешь

f_op.read(buffer, len_file);
В buffer - не забывай ноль вконце buffer[ len_file] = '\0';
И закрывай поток сразу
f_op.close();
А потом уж выводи

Касательно размера файла - если ОЗУ хватает, то читай образ в оперативу а не ломай мозг постоянным считыванием из файла, время которое уйдёт на первоначальное время чтения 2 Гб с лихвой покроется постоянным почитыванием 4 кБ как тут "гуру" предлагают...Впрочем решать тебе, копошиться в файле с блошиным чтением или быстро обрабатывать данные из оперативной памяти!

Цитата Сообщение от talis Посмотреть сообщение
На жёстком есть образ DVD хотя бы одной игры (желательно больше 2 Gb)
- касательно этого вместо этого
//длинна файла
int len_file;
запиши
unsigned long len_file - как раз на 4096 Мб хватит
KorPaEv
 Аватар для KorPaEv
53 / 29 / 2
Регистрация: 08.07.2011
Сообщений: 171
09.09.2011, 17:32  [ТС]     Размер и выделение памяти под открытие файла. #16
Спасибо еще раз всем за участие))) буду дерзать далее.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.09.2011, 15:46     Размер и выделение памяти под открытие файла.
Еще ссылки по теме:

Выделение памяти под массив C++
Выделение памяти под указатель C++
выделение памяти под структуру C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
TheAthlete
 Аватар для TheAthlete
151 / 151 / 12
Регистрация: 31.08.2010
Сообщений: 529
10.09.2011, 15:46     Размер и выделение памяти под открытие файла. #17
На мой вгляд, Вам нужно посмотреть в сторону "Проецируемыемых в память файлов". Этот метод позволит не заморачиваться с выделением буферов, тем более, что система не даст выделить буфер размером 2 ГБ и более.

Более подробно можете почитать в книге "Джеффри Рихтер, Кристоф Назар - Windows via C/C++. Программирование на языке Visual C++" Глава 17. Проецируемые в память файлы
Yandex
Объявления
10.09.2011, 15:46     Размер и выделение памяти под открытие файла.
Ответ Создать тему
Опции темы

Текущее время: 18:56. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru