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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с большим файлом, fstream 
V
    Опции темы
tatan
Дата 8.12.2007, 04:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



baldina 
tnx, но не сейчас
сейчас уже время для вискиsmile
PM MAIL   Вверх
tatan
Дата 8.12.2007, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



baldina, gss ругается на строку 

ofstream::pos_type size (0, filesize);

говорит 'no matching function for call to `std::fpos<mbstate_t>::fpos(int, long long int&)' 

и на строку

cout << "File size is " << size.seekpos ()/(1024.*1024*1024) << "Gb\n";

'class std::streampos' has no member named 'seekpos' 
PM MAIL   Вверх
baldina
Дата 8.12.2007, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



По стандарту класс fpos is implementation-defined. И реализация в VC и gcc как видно различается.
Значит не удастся единообразно сделать. Увы.

Видимо имеет смысл обернуть работу с fpos в класс, реализация которого разная для разных типов компиляторов.

Добавлено через 11 минут и 5 секунд
Т.е. предлагается создать класс примерно такого вида (реализация для gcc и VC будет разная)

Код

struct pos_type {
  pos_type (long long o);
  pos_type (const std::streamoff&);
  operator std::streamoff () const;
  long long get () const;
};


тогда те проблемные строчки могут выглядеть так:

Код

ofstream::pos_type size = pos_type(filesize);

cout << "File size is " << pos_type(size).get ()/(1024.*1024*1024) << "Gb\n";

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


Шустрый
*


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

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



Пока знаний маловатоsmile
Вообщем пока сделал так

Код

lint main()
{
    fstream s;
    s.open("111.dat", ios::out | ios::binary);

    const unsigned int BUFSIZE = 8192 * 4;
    char* buf = new char [BUFSIZE];
    memset(buf, 0, BUFSIZE);
    for (long i = 0; i < 100000; i++)
        s.write(buf, BUFSIZE);
    long long l = (long long)(s.tellp()) - 10LL;
    #ifdef _MSC_VER
        fstream::pos_type size(0, l);
    #else
        fstream::pos_type size(l);
    #endif;  
    
    s.seekp(size);
    s << 'x';
        
    return 0;
}

  

Не знаю, насколько такой подход правильный
PM MAIL   Вверх
baldina
Дата 9.12.2007, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Нормальный подход.
А мое предложение заключалось в том, что если таких мест много, не плодить дефайны по коду, а собрать только в одном месте. Связность системы надо уменьшать.

Т.е. 
Код

// fpos.h
struct pos_type {
  pos_type (long long);
  pos_type (const std::fstream::pos_type&);
  operator std::fstream::pos_type () const;
  long long& get ();
 private:
  long long pos;
};

//fpos.cpp

pos_type::pos_type (long long o) : pos(o) {}
pos_type::pos_type (const std::fstream::pos_type& off)
#ifdef _MSC_VER
: pos(off.seekpos ())
#else
: pos(off)
#endif    
{
}

pos_type::operator std::fstream::pos_type () const
{
#ifdef _MSC_VER
  return std::fstream::pos_type (0,pos);
#else
  return std::fstream::pos_type (pos);
#endif    
}
  
long long& pos_type::get () { return pos; }



тогда можно писать
Код

#include "fpos.h"

int main()
{
    fstream s;
    s.open("111.dat", ios::out | ios::binary);

    const unsigned int BUFSIZE = 8192 * 4;
    char* buf = new char [BUFSIZE];
    memset(buf, 0, BUFSIZE);
    for (long i = 0; i < 100000; i++)
        s.write(buf, BUFSIZE);

    pos_type size = s.tellp();
    size.get () -= 10;
    s.seekp(size);

    s << 'x';
        
    return 0;
}



PM MAIL   Вверх
tatan
Дата 9.12.2007, 02:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



спасибо
завтра попробую
PM MAIL   Вверх
hkklr
Дата 9.12.2007, 07:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если вы про Visual Studio, то там вобще в стандартной библиотеке всё криво написано. Да и вообще, зачем нужны эти объектно-ориентированные потоки, тормозные они...
PM MAIL   Вверх
archimed7592
Дата 9.12.2007, 08:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

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



hkklr, конечно, давайте лучше вернёмся в каменный век, ради выйгрыша в пару тактов.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
tatan
Дата 10.12.2007, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



К сожалению, даже благодаря любезному baldina заставить работать VC с большим файлом  не удалось, наверное я что-то недопонял
Если кому-то будет интересно выкладываю небольшие исходники.
gcc с этим работает правильно работает 
вот блин

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  adb.zip 13,64 Kb
PM MAIL   Вверх
baldina
Дата 10.12.2007, 00:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(hkklr @ 9.12.2007,  07:42)
Если вы про Visual Studio, то там вобще в стандартной библиотеке всё криво написано. Да и вообще, зачем нужны эти объектно-ориентированные потоки, тормозные они...

Про криво сами додумались али кто подсказал?
Не поленитесь, посмотрите копирайты включаемых файлов.
Заодно интересно было б услышать, что именно там криво.

Sorry за  smile 
PM MAIL   Вверх
baldina
Дата 10.12.2007, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Запускаю исходники, получаю такой результат:

Код

1.dat
16384
Comment for ADBPagedFile
20071210010444
100000
200000
300000
400000
500000
600000
700000
800000
900000
1000000
20071210011131
1000049
File size: 3268677632
Для продолжения нажмите любую клавишу . . .


Это верно или как? Файло указанного размера создалося...
Компилятор - VC 2003

Добавлено через 12 минут и 12 секунд
Глядя внутрь исходников, делаю осторожный вывод, что по крайней мере в отношении pos_type все правильно.  smile 
PM MAIL   Вверх
tatan
Дата 10.12.2007, 01:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



У меня MS VS 9

выдает 
File size: 0
Сам файл 4096 Mb

а должен быть - миллион страниц по 8192Kb

Dev-C++ с gсс говорит все правильно - 7813Mb
К тому же в main есть вызов, проверяющий логику программы - f.SetPageFree(999997), здесь он отрабатывает правильно - помечает
в файле страницу с таким порядковым номером свободной 

Непонятно, почему у нас разные результаты прогонов с VC

Добавлено через 3 минуты и 2 секунды
"Глядя внутрь исходников, делаю осторожный вывод, что по крайней мере в отношении pos_type все правильно. "

Ну значит Ваше время потрачено не зряsmile
Собственно я без изменений Ваш код и засунул
Может правда использовал его не так, я там с бубном прыгал в простом файле adbfile.cpp
PM MAIL   Вверх
baldina
Дата 10.12.2007, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну у меня 7гиг свободных просто нету, чуть больше 3х сейчас. И файл создался примерно такой.

MS VS 9 - Это что, 2008? Здесь нету, а завтра на работе могу и под него попробовать. И вряд ли оно стухло в более поздней.
Стоит поглядеть, действительно ли под VC компилируется то что надо. Отладчик для того придумали.
Может, конечно, моё заклинание только на моём компе работает  smile но думаю врядли

Добавлено @ 01:46
Ваш бубен видел, вы там еще забыли return  в случае если файл не открыт...

Добавлено @ 01:48
В утешение: поглядите в boost, как они бьют в бубен для каждого компилятора (и даже версии)

Это сообщение отредактировал(а) baldina - 10.12.2007, 01:48
PM MAIL   Вверх
tatan
Дата 10.12.2007, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, MS Visual C++ 2008 Express Edition

До 4Gb работает нормально и в VC, можно убедиться поставив в for место 1000000   400000, и поменяв в f.SetPageFreу аргумент на например 
399997

 boost ни разу не видел, рановато думаю еще, но утешаюсьsmile

Если не очень трудно, попробуйте plz

про return наверное не забыл

я буду думать еще про систему обработки ошибок и исключений, пока просто не обращаю внимания
PM MAIL   Вверх
baldina
Дата 10.12.2007, 02:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ладно, утром поглядим
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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