![]() |
|
Модераторы: bsa |
![]()
|
|
| ColdSpirit |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 10.12.2010 Репутация: нет Всего: 2 |
Здравствуйте. Проблема такая: нужно быстрое перемещение по текстовым файлам (большим), запоминание адреса и перемещение на адрес. Пытался использовать tellg() и seekg() - не работает нормально, а почему понять не смог (если нужно, могу подготовить пример по ним). В общем незнаю что использовать. Перебор строк не подойдет - файлы большие.
Второй вопрос - могу ли я при использовании функции getline(file, string) задать опцию, чтобы при чтении курсор не перемещался к следующей строке? |
|||
|
||||
| feodorv |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Нужно.
Нет. -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
|||
|
||||
| tzirechnoy |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1173 Регистрация: 30.1.2009 Репутация: -1 Всего: 16 |
Для перемещения по файлу, с которым работаете через STDIO -- предназначены функцыи fseek(), ftell(), rewind(), fgetpos(), fsetpos().
Откуда Вы взяли seekg и tellg -- я просто не знаю, возможно, какая-то локальная особенность Вашэй операцыонной системы для обхода каких-то древних глюков. Для того жэ самого с файлами, с которыми Вы работаете через дескрипторы (open()/read()/write()) есть lseek(). Но, судя по getline() -- Вы работаете через stdio, в таком случае применять lseek() нельзя. |
|||
|
||||
| ColdSpirit |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 10.12.2010 Репутация: нет Всего: 2 |
feodorv, вот пример того, что у меня ничего не работает)
tzirechnoy, использую fstream, там тоже нельзя? Почему? |
|||
|
||||
| feodorv |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 12 Всего: 45 |
Не хватает
Честно говоря, я даже не знаю, что сказать (хотя в сети какие-то намёки есть). А какая у Вас платформа и компилятор? На виндах & VC6.0 все в порядке:
Правда, входной файл у меня нормальный:
Возможно, Ваш файл какой-то не такой (судя по оффсетам). В любом случае, я бы открыл файл в бинарном режиме ios::binary... -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||
|
|||||||
| ColdSpirit |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 10.12.2010 Репутация: нет Всего: 2 |
Странно, у меня без этого работает) Windows 7 x64, компилятор gcc, шел пакете с Code::Blocks
Проверил в hex - у меня точно такой же файл. Интересно, в бинарном режиме вроде нормально работает, хотя ранее при проверке у меня возникали какие-то проблемы, из-за которых я решил его не использовать. В общем спасибо, если появятся странности - отпишусь) Это сообщение отредактировал(а) ColdSpirit - 16.6.2014, 22:33 |
|||
|
||||
| ColdSpirit |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 10.12.2010 Репутация: нет Всего: 2 |
При использовании бинарного режима и ifstream все нормально, но когда использую fstream с тем же самым кодом, в строку заносится "-1, ", eof не срабатывает.
|
|||
|
||||
| NoviceF |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 313 Регистрация: 13.3.2012 Где: Ростов-на-Дону Репутация: 2 Всего: 2 |
||||
|
||||
| LeonidPr |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 17.2.2012 Где: г. Чебоксары Репутация: нет Всего: 1 |
если перебор строк не подходит может какую-нибудь индексацию придумать? В начале при открытии делать массив позиций в файле, с которых начинаются строки, а потом просто прыгать на эти позиции. Да, при открытии будет тормозить, но тут можно что-то типа кэша сделать, т.е. открыли, проиндексировали и таблицу индексов скинули в сопровождающий файл... ну это так мысли вслух конечно
--------------------
pkunzip.zip |
|||
|
||||
| ColdSpirit |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 10.12.2010 Репутация: нет Всего: 2 |
В общем установил себе Visual Studio 2008 и там все позиции нормально отображает, в бинари и стандартном режимах. Видимо это глюк GCC, кто-нибудь это может подтвердить?
Это тоже не работало, оказывается для fstream f(ios::binary) нужно еще указывать "ios::in | ios::out", чего я до сих пор не знал и не делал LeonidPr, хорошая идея, думаю пригодится) Вообще у меня сейчас другая проблема, но к этой теме не относится, кому интересно - прошу сюда http://forum.vingrad.ru/forum/topic-378400.html Это сообщение отредактировал(а) ColdSpirit - 19.6.2014, 10:53 |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |