Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Какой максимальный размер файла для std::fstream?


Автор: mrgloom 24.6.2014, 14:20
есть стандартный метод определения размера файла
Код

// 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?

Автор: ColdSpirit 24.6.2014, 17:00
mrgloom, наверное до sizeof(streampos) или sizeof(pos_type), непомню сколько он занимает. Меня тоже это интересует, и еще, если кто знает, в чем разница между streampos, pos_type и остальными?

Автор: mrgloom 7.7.2014, 10:36
решил не использовать 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);
                
                //далее читаем файл в буффер



но проблема в том, http://www.firstobject.com/fseeki64-ftelli64-in-vc++.htm пишут 
Цитата

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


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

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

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

Автор: mrgloom 7.7.2014, 12:26
ну так мне не надо несколько блоков по 2Гб

какие варианты? только memmaped file?

Автор: volatile 7.7.2014, 12:39
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 раз не есть гуд.
лучше читать понемногу, и в промежутках проверять, (например) не нажал ли пользователь отмену.

Автор: Alexeis 8.7.2014, 12:47
Прикольно, я чет думал, что адресуемый размер файла должен ограничиваться макс значением типа 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х битный указатель смещения.

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