Модераторы: 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   Вверх
Страницы: (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.0616 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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