Russian Qt Forum
Ноябрь 26, 2024, 01:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запись в бинарный фаил  (Прочитано 10864 раз)
hamlo
Гость
« : Декабрь 21, 2009, 11:19 »

Есть задача, обратится к бинарому файлу к конкретному байту и изменить его, не считывая весь фаил. Как это лучше сделать?
Записан
niXman
Гость
« Ответ #1 : Декабрь 21, 2009, 11:37 »

Qt-way: QFile::open(ReadWrite)
not Qt-way: http://en.wikipedia.org/wiki/Memory-mapped_file
Записан
hamlo
Гость
« Ответ #2 : Декабрь 21, 2009, 12:03 »

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

Может форум для этого и существует, а не трансляцию ссылок из гугла на куски док, при наличии времени, я бы и сам которые спокойно вкурил...
Записан
Makss
Гость
« Ответ #3 : Декабрь 21, 2009, 12:22 »

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

У QIODevice есть функции позиции файла и перепрыгивания на любую позицию...
pos() - текущая позиция
seek() - прыгнуть на любую позицию
Записан
hamlo
Гость
« Ответ #4 : Декабрь 21, 2009, 12:39 »

спс
Записан
hamlo
Гость
« Ответ #5 : Декабрь 23, 2009, 10:35 »

Появилась необходимость записать на указанный бит метку EOF. Как это сделать? Какой функцией или какой специальный символ(последовательность символов записать). Желательно чтобы этот вызов был платформонезависимым и (или) обрабатывался в программе под наиболее распространенные платформы (файловые системы).
Записан
niXman
Гость
« Ответ #6 : Декабрь 23, 2009, 12:20 »

так тебе нужно записать символ, или установить конец файла в нужной позиции?
код символа EOF = (unsigned)-1
Записан
hamlo
Гость
« Ответ #7 : Декабрь 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. Ничего не понимаю... Может я не так пишу?
« Последнее редактирование: Декабрь 23, 2009, 12:51 от hamlo » Записан
hamlo
Гость
« Ответ #8 : Декабрь 23, 2009, 15:29 »

Прошу прощения за глупость) EOF только для текстового файла. Обрезание бинарного файла можно реализовать только изменением значения длины файла на уровне файловой системы =)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #9 : Декабрь 23, 2009, 15:50 »

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

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Декабрь 23, 2009, 15:57 »

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

Юра.
ритт
Гость
« Ответ #11 : Январь 03, 2010, 09:14 »

Цитировать
bool QFile::resize ( qint64 sz )
Sets the file size (in bytes) sz. Returns true if the file if the resize
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.158 секунд. Запросов: 22.