Russian Qt Forum

Qt => Общие вопросы => Тема начата: hamlo от Декабрь 21, 2009, 11:19



Название: Запись в бинарный фаил
Отправлено: hamlo от Декабрь 21, 2009, 11:19
Есть задача, обратится к бинарому файлу к конкретному байту и изменить его, не считывая весь фаил. Как это лучше сделать?


Название: Re: Запись в бинарный фаил
Отправлено: niXman от Декабрь 21, 2009, 11:37
Qt-way: QFile::open(ReadWrite)
not Qt-way: http://en.wikipedia.org/wiki/Memory-mapped_file (http://en.wikipedia.org/wiki/Memory-mapped_file)


Название: Re: Запись в бинарный фаил
Отправлено: hamlo от Декабрь 21, 2009, 12:03
Ну открыть доку и прочитать про использование QFile и QDataStream ума много не надо. Но там не сказано(или я не увидел) ничего про работу с конкретными байтами непосредственно в файле на носителе. Как определить местоположения курсора в файле? Как пройти определенное количество байт (skipRawData()???) и где остановится курсор. Как обратится на изменения к конкретной позиции в файле и откуда начнется запись - со следующей позиции или на той позиции где установлен курсор? Как грамотно завершить запись в таком случае без записи eof? Вот эти вопросы и некоторые другие меня интересуют - я думаю пользователи форума, ответив по конкретике на данные вопросы, сэкономят для меня кучу времени.

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


Название: Re: Запись в бинарный фаил
Отправлено: Makss от Декабрь 21, 2009, 12:22
в асистенте всё есть, всё что вам нада - всё такие функци в QFile есть, будьте внимательны, т.к. QFile наследуется от QIODevice, если в асистенте вы ничего не увидили из того что вам нужно именно у QFile, то это ещё ничего не значит что "НИЧЕГО НЕТУ" - смотрите родительский класс ещё

У QIODevice есть функции позиции файла и перепрыгивания на любую позицию...
pos() - текущая позиция
seek() - прыгнуть на любую позицию


Название: Re: Запись в бинарный фаил
Отправлено: hamlo от Декабрь 21, 2009, 12:39
спс


Название: Re: Запись в бинарный фаил
Отправлено: hamlo от Декабрь 23, 2009, 10:35
Появилась необходимость записать на указанный бит метку EOF. Как это сделать? Какой функцией или какой специальный символ(последовательность символов записать). Желательно чтобы этот вызов был платформонезависимым и (или) обрабатывался в программе под наиболее распространенные платформы (файловые системы).


Название: Re: Запись в бинарный фаил
Отправлено: niXman от Декабрь 23, 2009, 12:20
так тебе нужно записать символ, или установить конец файла в нужной позиции?
код символа EOF = (unsigned)-1


Название: Re: Запись в бинарный фаил
Отправлено: hamlo от Декабрь 23, 2009, 12:32
HEX значение EOF, чтобы вписать его в фаил в нужной позиции.

125 строка stdio.h
Код:
#define EOF (-1)

пишу в QT
Код:
QFile file("/path/to/file");
file.open(QIODevice::ReadWrite)
QButeArray barray;
barray.append(EOF);
file.seek(position)
file.write(barray);
file.close;

На указанной позиции(position) созерцаю FF. Ничего не понимаю... Может я не так пишу?


Название: Re: Запись в бинарный фаил
Отправлено: hamlo от Декабрь 23, 2009, 15:29
Прошу прощения за глупость) EOF только для текстового файла. Обрезание бинарного файла можно реализовать только изменением значения длины файла на уровне файловой системы =)


Название: Re: Запись в бинарный фаил
Отправлено: Igors от Декабрь 23, 2009, 15:50
Прошу прощения за глупость) EOF только для текстового файла. Обрезание бинарного файла можно реализовать только изменением значения длины файла на уровне файловой системы =)
И текстового тоже. Символ "конец файла" (насколько я помню 0x1A) это просто дополнительная возможность которую текстовые редакторы используют (если хотят). Так что нет смысла с ним возиться, проще действовать через QFile::resize


Название: Re: Запись в бинарный фаил
Отправлено: lit-uriy от Декабрь 23, 2009, 15:57
Явно работать с байтом индицирующим конец файла это вообще плохая затея. Т.к. никто кроме ОСьки не скажет точно где конец файла.
Пример, P-CAD 200x. Встретил в текстовом файле 0xFF, решил , что это конец файла. А на деле это буква "я" (маленькая), но ведь файл не кончился, там ещё две третьих содержимого!


Название: Re: Запись в бинарный фаил
Отправлено: ритт от Январь 03, 2010, 09:14
Цитировать
bool QFile::resize ( qint64 sz )
Sets the file size (in bytes) sz. Returns true if the file if the resize