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

Поиск:

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


Шустрый
*


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

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



Работаю с большим файлом ~30Gb, использую fstream
В Dev-C++ все в порядке, VC затыкается на ~2Gb.
Ошибку найти не могу, вроде в seek везде использую long long.
В любом случае код тот же.
Может такое быть, что fstream из VC не работает большими файлами?
Или есть неочевидные особенности?
Как вообще найти такого рода ошибку?

PM MAIL   Вверх
Alek86
Дата 7.12.2007, 15:58 (ссылка) |   (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



да, в свойствах fstream для размера и т.п. используется int.

поищи в гугле traits для fstream, думаю, там будут советы, как поменять int на long long (кажись, это не просто)


--------------------
user posted image    user posted image
PM MAIL   Вверх
tatan
Дата 7.12.2007, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Да, действительно int.
Советов не нашел.
А почему в DevC++ работает как надо?
И как в VC работают с большими файлами?
PM MAIL   Вверх
Alek86
Дата 7.12.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



нда, там кода куча для работы с большими файлами

http://www.cyberguru.ru/programming/cpp/cp...aits-page4.html

Это сообщение отредактировал(а) Alek86 - 7.12.2007, 16:50


--------------------
user posted image    user posted image
PM MAIL   Вверх
bsa
Дата 7.12.2007, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



tatan, по стандарту позиция файла должна указываться типом streampos. У gcc это typedef fpos<mbstate_t> streampos;
шаблон fpos, содержит поле streamoff _M_off; а streamoff - это typedef от long long или int64
PM   Вверх
tatan
Дата 7.12.2007, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



нда, сложновато для меня-новичка
спасибо
PM MAIL   Вверх
bsa
Дата 7.12.2007, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(tatan @ 7.12.2007,  16:58)
нда, сложновато для меня-новичка
спасибо

Не хочешь наступить на грабли MS? Тогда вместо long long используй streampos для установки/хранения позиции файла.
PM   Вверх
tatan
Дата 7.12.2007, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На грабли не хочу ни MS, ни любые другие, но так видимо устроен мирsmile
Спасибо, вечером буду пробовать streampos

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


Эксперт
****


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

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



tatan, на граблях учатся лучше всего. Ты уже на одни наступил, а о следующих я предупредил... smile 
PM   Вверх
tatan
Дата 8.12.2007, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Видимо я что-то не понял
Приведение типов в стиле С (streampos) во всех seek'ах и вообще во всех нужных и ненужных местах ничего не изменило
VC++, видимо лучший компайлер, но бороться не буду - потренируюсь с gss
Все же что-то не так делаю, bsa, вы могли могли бы уточнить свои рекомендации для чайников?
PM MAIL   Вверх
bsa
Дата 8.12.2007, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



tatan, обнови VS на что-то более новое. Скорее всего, у тебя какая-то древняя версия.
PM   Вверх
tatan
Дата 8.12.2007, 01:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Неа, MS Visual Studio 2008
Version 9.0.21022.8 RTM

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


Эксперт
****


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

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



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


Шустрый
*


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

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



to bsa: могу ли я вам сбросить код на mail? для проф комент
Чертовски был бы благодарен за помощь
вам будет интересно, но сюда неприлично- слишком сыро
а если вы в мск  - проставлюсь по-любе smile
PM MAIL   Вверх
baldina
Дата 8.12.2007, 03:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Да тут довольно просто все.
Дело в том, что ofstream::pos_type содержит streamoff, который действительно небольшой в VC, и fpos_t, который достаточного размера.
Соответственно есть разные конструкторы для его инициализации.
fstream::seekp() тоже имеет две формы - с pos_type и off_type в качастве типа параметра.
Посмотрите код ниже, как это делается. Компилилось на VS 2003. Размер файла в примере 2.5Г т.к. на диске просто больше нет места  smile 

Код

#include <fstream>
#include <iostream>

int main()
{
  using namespace std;

  ofstream s ("c:/out.dat");

  long long filesize = 5LL * 1024 * 1024* 1024/ 2;
  ofstream::pos_type size (0, filesize);

  s.seekp (size);
 
  s << 'x';

  size = s.tellp ();

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

  s.close();

  return 0;
}



PM MAIL   Вверх
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   Вверх
bsa
Дата 10.12.2007, 12:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



tatan, а у тебя файловая система на диске случайно не FAT?
PM   Вверх
tatan
Дата 10.12.2007, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, конечно
Я же говорю, gcc нормально работает
PM MAIL   Вверх
baldina
Дата 10.12.2007, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вобщем так. VC 7.1 и VC 9 работают одинаково. Файл у меня создается немногим больше 4Г (т.е. 4Г - не ограничение).
Затыкается, когда вот тут


Код

    double f = ceil( (double)pageNo / (double)(itsFileHeader.PageSize - sizeof(ADBPageDescriptor) ) ) ;
    unsigned long pNum = static_cast <unsigned long> (f);

    unsigned long k = itsFileHeader.FirstSIP;
    unsigned long j = 1;
    ADBPageDescriptor ph;
    memset((char*) &ph, 0, sizeof(ph));
    ph.ID = 1;
    ClearIO();
    while (j < pNum + 1)
    {
        //itsFile.seekg( (std::streampos) ((std::streampos)(k - 1) * (std::streampos)itsFileHeader.PageSize), std::ios::beg);
        //itsFile.read((char*) &ph, sizeof(ph));
        SetPosition((unsigned long long)(k - 1) * itsFileHeader.PageSize);
        ReadBuffer((char*) &ph, sizeof(ph));
        ClearIO();
        
       k = ph.NextPage; // <<<<<------- ВОТ ТУТ
       j++;
    };
    //itsFile.clear();



k становится равным 0.
Посмотрел как записывается ADBPageDescriptor, но так и не понял. Во многих местах похожий, но разный код, разбираться лень. Но дело тут явно не в ограничениях на размер и не работе streamoff. Похоже где то либо переполнение (например в unsigned short), либо ошибка в приведении типа.
Еще замечено, что поток вывода в некоторый момент приобретает ошибочное состояние, которое не анализируется и не сбрасывается сразу.

Добавлено через 3 минуты и 41 секунду
Я его долго мотал по отладчику (в т.ч. пытаясь понять, что оно таки делает  smile).
Затыкается, когда pNum становится равным 65.
PM MAIL   Вверх
tatan
Дата 10.12.2007, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Это файл, организованный из страниц одинакового размера, заготовка под будущую карманную СУБД
Есть системный тип страниц, SpaceInventoryPage, эти страницы содержат сведения о других страницах - свободны или нет.
При открытии файла свободные страницы заносятся в вектор SIParray, для ускорения получения free page. 
Такие страницы организованы в список - у каждой в заголовке содержится номер предыдущей и следующей страницы
ADBFile - просто файл и основные действия
ADBPage - только для того, чтобы работать с зашифрованным RC-4 файлом, ADBPagedFile смотрит, если файл зашифрован, то подает клиенту расштфрованный буфер страницы. Можно было всю работу в ADBPageedFile организовать через ADBPage, но накладно.
ADBPagedFile - собственно сам страничный файл, отвечает за выделение-освобождение, использование страниц
Спасибо, baldina, буду искать косяк.
Отладчиком пользоваться не умею, буду учиться.
Правда, непонятно, почему с gcc работает и вроде как после интенсивной проверки логики
PM MAIL   Вверх
tatan
Дата 10.12.2007, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Короче, пока завязал с VC, следующий код, компиленный gcc, правильно работает, VC - нет
Видимо какие-то особенности VC я не принимаю о внимание
Найду все равноsmile
Всем спасибо
Програма создает файл ~6250 Mb, устанавливает файловый указатель на filesize - 100 и пишет в файл тестовую строку
Код

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
#include <vector>


#include "adbfile.hpp"
#include "adbcomm.hpp"
#include "adbpfile.hpp"

int main(int argc, char *argv[])
{
    ADBFile f("1.dat");
    f.CreateFile();
    f.OpenFile();

    const char* ch = "Test string for ADBFile";
        const int BUFSIZE = 8192 * 100;
    char* buf = new char [BUFSIZE];
    memset(buf, 0, BUFSIZE);
    const long pc = 8000;
    for (int i = 0; i < pc; i++)
    {
        f.SetPosition((unsigned long long)i * BUFSIZE);
        f.WriteBuffer(buf, BUFSIZE);
    }

    std::cout << "FileSize: " << f.Size() << std::endl;

    f.SetPosition(f.Size() - 100);

    std::cout << "Pos: " << f.GetPosition() << std::endl;
    f.WriteBuffer((char*) ch, strlen(ch));
    f.CloseFile();

    delete [] buf;
    system("PAUSE");
    return 0;
}


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


Эксперт
****


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

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



tatan, дело оказалось не в программе. 
Не работает fstream::seekp() на файлах больше 4Г.
Потоки вызывают стандартную библиотеку С, та - ядреную функцию Win32.
fstream::seekp() -> fseek() -> _lseek() -> SetFilePointer().
Вот SetFilePointer() (kernel32.dll) и не работает на больших файлах, если вызывается так, как это делает _lseek().

DWORD SetFilePointer(
  HANDLE hFile,
  LONG lDistanceToMove,
  PLONG lpDistanceToMoveHigh,
  DWORD dwMoveMethod
);

lpDistanceToMoveHigh - NULL для небольших смещений, либо указатель на старшую часть смещения для больших. Так вот _lseek передает NULL. При таком вызове на больших файлах SetFilePointer завершается с ошибкой. А правильно вызывает 64-битная версия _lseek.

Обойти можно так - я переделал стандартную функцию fseek(), вызвав её 64-битную версию.
Надо просто добавить прилагаемый файл в проект, и будет работать.

С CRT линковать надо статически. 

Удачи.

Это сообщение отредактировал(а) baldina - 11.12.2007, 15:31

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  fseek_64.c 0,22 Kb
PM MAIL   Вверх
tatan
Дата 11.12.2007, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



A я стер ADBFile и переписал с FILE*, 
Код

#ifdef _MSC_VER
    #define fopen64 fopen
    #define fseek64 _fseeki64
    #define ftell64 _ftelli64
#else
    #define fopen64 fopen64
    #define fseek64 fseeko64
    #define ftell64 ftello64
#endif    


 и все заработало.

спасибо, baldina, что столько времени потратил на меня, я попробую вернуться к fstream

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.1934 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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