crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Проблема с записью в файл
AD
  опции профиля:
сообщение 14.4.2008, 18:21
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Использую QFile* file. Файл открыт для чтения/записи. в середине файла надо заменить одну строчку. Как это сделать?
Код
QTextStream in(file);
in << string;

Почему-то вставляет в конец файла строку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.4.2008, 19:21
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


из того что ты привел, ничто неуказывает на замену строки, а запись в файл обычно идет последовательно, если ты его толко открыл и писать начал, то будет дописывать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 14.4.2008, 19:32
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Litkevich Yuriy @ 14.4.2008, 20:21) *
из того что ты привел, ничто неуказывает на замену строки, а запись в файл обычно идет последовательно, если ты его толко открыл и писать начал, то будет дописывать.

как корректно заменить строку? В файле уже есть данные, мне необходимо заменить только некоторые строчки! При этом на функцию setString() он совсем плохо реагирует!!! В итоге и зависает!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.4.2008, 20:33
Сообщение #4


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


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

Если знаешь номер строки то, например, так:
Открыть файл,
в цикле читать строку с помощью QTextStream::readLine пока не доберешся до (нужной -1),
запомнить позицию в файле с помощью QIODevice::pos()
прочитать следующую (нужную) строку,
изменить ее,
передвинуть файловый указатель до запомненой позиции с помощью QIODevice::seek (),
записать строку.

Если незнаешь номер строки, то нужно каждую анализировать.
---
Может есть и удобнее способ, незнаю.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 15.4.2008, 7:26
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Это сработает, только если длинна исходной строки и замены одинаковая.
Если нет - или получишь огрызок старой, или затрёшь кусок следующей.

Классически алгоритм совсем простой:
1) читаешь исходный файл построчно.
2) строки, возможно изменённые пишешь в выходной файл.
3) после того, как всё прочитал/записал удаляешь исходный.
4) переименовываешь выходной в исходный.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.4.2008, 8:44
Сообщение #6


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


ну да так оно правильней
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.4.2008, 9:16
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(Tonal @ 15.4.2008, 8:26) *
Классически алгоритм совсем простой:
1) читаешь исходный файл построчно.
2) строки, возможно изменённые пишешь в выходной файл.
3) после того, как всё прочитал/записал удаляешь исходный.
4) переименовываешь выходной в исходный.

Так и подумал! :)
Какими строчками кода удалить файл, какими переименовать? Создать файл с помощью флажка trancate?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 15.4.2008, 18:26
Сообщение #8


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Как переименовывать файл с помощью кода Qt? Как его удалять?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 16.4.2008, 8:01
Сообщение #9


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


bool QFile::remove ()
bool QFile::rename ( const QString & newName )
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 18.4.2008, 10:24
Сообщение #10


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


В обычном Си для создания и открытия файла используется значок truncate. А в Qt как это сделать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 18.11.2019, 16:39