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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Какой максимальный размер файла для std::fstream? 
:(
    Опции темы
mrgloom
Дата 24.6.2014, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



есть стандартный метод определения размера файла
Код

// Open file and get file size
int FileSize;
std::fstream myFile;
myFile.open(myFileName, std::ios::in|std::ios::binary);
if (myFile.is_open())
{
    myFile.seekg(0, std::ios::end);
    myFileSize = myFile.tellg();
    myFile.seekg(0, std::ios::beg);
    myFile.close();
}


но при каких условиях seekg или tellg будут работать неправильно? какие ограничения для х32 и х64?
PM MAIL   Вверх
ColdSpirit
Дата 24.6.2014, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



mrgloom, наверное до sizeof(streampos) или sizeof(pos_type), непомню сколько он занимает. Меня тоже это интересует, и еще, если кто знает, в чем разница между streampos, pos_type и остальными?
PM MAIL   Вверх
mrgloom
Дата 7.7.2014, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



решил не использовать std::stream, код типа такого


Код

    FILE* f = _tfopen(fileName, _T("rb"));
    if(f != NULL)
    {
        if( _fseeki64(f,0,SEEK_END) != 0)    // 0 == success
            return false;
        __int64 file_size = _ftelli64(f);
        if (file_size == 0)
            return false;
        _fseeki64(f, 0, SEEK_SET);
                
                //далее читаем файл в буффер



но проблема в том, тут пишут 
Цитата

There are no 64-bit offset versions of fread and fwrite functions. 


и как быть с файлами больше 2 Гб ?

PM MAIL   Вверх
volatile
Дата 7.7.2014, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(mrgloom @  7.7.2014,  10:36 Найти цитируемый пост)
There are no 64-bit offset versions of fread and fwrite functions. 

потому-что не нужны.
они и так читают большие файлы.
дальше там написано же.

PM MAIL   Вверх
mrgloom
Дата 7.7.2014, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну так мне не надо несколько блоков по 2Гб

какие варианты? только memmaped file?
PM MAIL   Вверх
volatile
Дата 7.7.2014, 12:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



mrgloom
Цитата
so in theory you can read multiple 2GB blocks using fread even if you don't have a 64-bit ftell 


Добавлено через 2 минуты и 34 секунды
а вообще такие большие блоки читать за 1 раз не есть гуд.
лучше читать понемногу, и в промежутках проверять, (например) не нажал ли пользователь отмену.

PM MAIL   Вверх
Alexeis
Дата 8.7.2014, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 12
Всего: 459



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

Но если открыть доку http://www.cplusplus.com/reference/ios/streamoff/
То в стандарте 98го года говорят что 
Цитата

The underlying type depends on the particular library implementation.

В новом же стандарте 
Цитата

It is a typdef of one the fundamental signed integral types large enough to represent the maximum possible file size supported by the system.

Так что используя новый компилятор можно все же надеется на 64х битный указатель смещения.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.1027 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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