Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум на CrossPlatform.RU _ Qt Ввод/Вывод, Сеть. Межпроцессное взаимодействие _ Проблема с записью в файл

Автор: AD 14.4.2008, 18:21

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

QTextStream in(file);
in << string;

Почему-то вставляет в конец файла строку.

Автор: Litkevich Yuriy 14.4.2008, 19:21

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

Автор: AD 14.4.2008, 19:32

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

как корректно заменить строку? В файле уже есть данные, мне необходимо заменить только некоторые строчки! При этом на функцию setString() он совсем плохо реагирует!!! В итоге и зависает!

Автор: Litkevich Yuriy 14.4.2008, 20:33

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

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

Если незнаешь номер строки, то нужно каждую анализировать.
---
Может есть и удобнее способ, незнаю.

Автор: Tonal 15.4.2008, 7:26

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

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

Автор: Litkevich Yuriy 15.4.2008, 8:44

ну да так оно правильней

Автор: AD 15.4.2008, 9:16

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

Так и подумал! :)
Какими строчками кода удалить файл, какими переименовать? Создать файл с помощью флажка trancate?

Автор: AD 15.4.2008, 18:26

Как переименовывать файл с помощью кода Qt? Как его удалять?

Автор: ViGOur 16.4.2008, 8:01

http://www.crossplatform.ru/documentation/qtdoc4.3/qfile.php#remove
http://www.crossplatform.ru/documentation/qtdoc4.3/qfile.php#rename

Автор: AD 18.4.2008, 10:24

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

Автор: Litkevich Yuriy 18.4.2008, 10:41

в Qt тоже такой есть http://www.crossplatform.ru/documentation/qtdoc4.3/qiodevice.php#OpenModeFlag-enum

для создания нового файла тебе этот флаг погоды не сделает, ведь он все равно пустой.

Автор: AD 18.4.2008, 11:16

Цитата(Litkevich Yuriy @ 18.4.2008, 11:41) *
в Qt тоже такой есть http://www.crossplatform.ru/documentation/qtdoc4.3/qiodevice.php#OpenModeFlag-enum

для создания нового файла тебе этот флаг погоды не сделает, ведь он все равно пустой.

правильный код или нет?
                modif_fl = new QFile(modifFilename);
        modif_fl -> open(QIODevice::WriteOnly | QIODevice::Truncate);

Под правильностью я понимаю, что создасться файл для записи с именем modifFilename.
Мне и нужен пустой файл :)

Автор: Litkevich Yuriy 18.4.2008, 11:26

если modifFilename - строковая переменная то помоему все верно, если само имя файла, то в кавычки возьми

Автор: AD 18.4.2008, 11:29

Цитата(Litkevich Yuriy @ 18.4.2008, 12:26) *
если modifFilename - строковая переменная то помоему все верно, если само имя файла, то в кавычки возьми

Строковая переменная, при этом включающая путь к файлу! :)

Форум Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)