Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QFile как считать поледеню строку. 
:(
    Опции темы
Remiznik
Дата 18.4.2011, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



  Нужно открыть файл если он сушествуе прочитать последнюю строку и выташить из неё одно значени. Файл записываеться построчно. Не понима как прочитать именно последнюю строку ? Поискал в интенете там всё пишут что нужно последовательно перебирать весь файл но не понятно. А более удобного способа нет ? 
PM MAIL   Вверх
borisbn
Дата 18.4.2011, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Remiznik @  18.4.2011,  11:20 Найти цитируемый пост)
Поискал в интенете там всё пишут что нужно последовательно перебирать весь файл но не понятно. А более удобного способа нет ? 

Это, пожалуй, самый удобный способ, но не быстрый. Возможно быстрее будет так (псевдокод)
Код

char ch = 0;
i = 1;
std::string str;
while ( ch != '\n' ) {
    file.seek( fileSize - i );
    ch = file.readChar();
    str.push_front( ch );
    i++;
}

смысл такой: сдигаешь указатель чтения по одному байту от конца файла, считываешь символ и добавляешь его в начало результирующей строки, пока не прочитаешь перевод строки...


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Remiznik
Дата 18.4.2011, 16:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 Ешо такой вопрос. 

 Я нашол нужную мне строку в файле. Файл записан по строчно и одно значение в найденой строке нужно заменить на другое. Что то типа replace в QString. 
PM MAIL   Вверх
borisbn
Дата 18.4.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Если в последней строке, то можно эту строку считать, вернуться на её начало ( file.seek() ), "отрезать" файл на текущую позицию, заменить в строке то, что нужно, и добавить строку в конец файла


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Remiznik
Дата 18.4.2011, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 Например фай состоит из 100 строк определёной последовательности в 50 строке нужно заменить один символ. Предёться переписывать все 50 оставшихся строк ? 
PM MAIL   Вверх
math64
Дата 18.4.2011, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Remiznik @  18.4.2011,  16:49 Найти цитируемый пост)
Например фай состоит из 100 строк определёной последовательности в 50 строке нужно заменить один символ. Предёться переписывать все 50 оставшихся строк ? 

Именно так, если вставляемая строка длиннее или короче старой.
Если новая строка той же длины, можно не перезаписывать, но только если запись не обрезает файл
при использоваии низкоуровневых функций open(), read(), write(), close(), lseek() из <io.h> обрезки не происходит  (там для обрезки нужно записать 0 байт), но код будет зависеть от компилятора и ОС.
Код поиска последней строки, предложенный  borisbn годится для кодировки latin1, win1251 (если исходники  в этой кодировке), но его нужно модифицировать для utf8.   

Это сообщение отредактировал(а) math64 - 18.4.2011, 18:37
PM   Вверх
Sartorius
Дата 18.4.2011, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1568
Регистрация: 18.7.2006
Где: Ivory tower

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



Remiznik, загружай файл целиком в память, думаю он у тебя << 1Гб
PM MAIL ICQ   Вверх
math64
Дата 18.4.2011, 21:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



A для больших файлов можно использовать маппинг - отображнение части файла в память.
PM   Вверх
Remiznik
Дата 19.4.2011, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



но это только системными функциями можно сдалать ? 
PM MAIL   Вверх
borisbn
Дата 19.4.2011, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

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



Цитата(Remiznik @  19.4.2011,  09:39 Найти цитируемый пост)
но это только системными функциями можно сдалать ? 

маппинг можно QFile::map() / QFile::unmap()


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
roatueque
Дата 8.2.2023, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Lucilleemamb
Дата 27.3.2023, 07:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Lucilleemamb
Дата 4.4.2023, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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




Модератор: Сообщение скрыто.

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


Новичок



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

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




Модератор: Сообщение скрыто.

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


Новичок



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

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




Модератор: Сообщение скрыто.

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




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


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

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