Название: Запись в бинарный фаил Отправлено: 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"); На указанной позиции(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 |