![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Работа с файлами в бинарном режиме. Вопросы без ответов в литературе
Хочу подробней изучить приемы редактирования файлов в бинарном режиме Перелистал уж пол гугла, море разной литературы, для чайников и профи. Но толком нигде не написано 1. Как удалить строку из файла 2. Возможно ли удалить определенную строку в файле (например вторую сверху или третью снизу) 3. Возможно ли просто вписать строку между 1 и 2 например чтоб остальные просто сдаивнулись вниз 4. Можно ли както обозначить конец строки кроме \n |
|||
|
||||
| Fazil6 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
в бинарном режиме нет строк
|
|||
|
||||
| _hunter |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 8564 Регистрация: 24.6.2003 Где: Europe::Ukraine:: Kiev Репутация: 16 Всего: 98 |
все это делается одним и тем же способом: создаем временный файл; пишем туда (читая из первого файла) все, что до целевой строки (места с которого ходим удалять/куда хотим добавлять); пишем добавляемую строку во временный файл/пропускаем удаляемую строку в первом файле; продолжаем читать/записывать. все.
строки искать придется самому (симолы \r/\n) обозначать, в таком режиме, строку можно хоть буквами "зю" -- главное стобы ты об этом помнил (и чтобы в файле не встречалось "левых" букв зю)... -------------------- Tempora mutantur, et nos mutamur in illis... |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Чтож пойдем другим путем.
Например. Имеется структура z И вот такой фрагмент кода выполняющий возврат на sizeof(z) байт назад. Возможно ли таким же образом перемещаться на 2 или 10 sizeof(z) байт назад. Что модифицировать?
|
|||
|
||||
| Shaggie |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
ausar, вопросик "не бей лежачего"... заведи переменную n=1, на сколько sizeof надо вернуться - такое число пиши в n
|
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Вопросик очень важный для меня и ответ как раз то что я ожидал но догадаться увы не мог.
Спасибо! |
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: нет Всего: 8 |
ausar, ты хочеш в файл записать массив структур?
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Нет я хочу научиться редактировать файл в бинарном режиме но нигде не описаны приемы. например как перемещаться по файлу. Как удалить строку. Как скопировать структуру z в temp чтоб потом вставить в другом месте
Вот что я сваял, компилятор не ругается! В идеале введя номер записи напр 2 выводится 2 запись. Но кроме черного экрана я пока ничего не добился :(
|
|||
|
||||
| Rapalex |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 732 Регистрация: 20.1.2006 Где: Украина -> Ник олаев Репутация: нет Всего: 8 |
Доступ к файлам последовательный, пожно менять позицию но в центре файла добавить строку так чтоб все остальные сместились НЕВОЗМОНО.
-------------------- In vitium ducit culpae fuga. Желание избежать ошибки вовлекает в другую. (Horatius) |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
ausar, было обсуждение этой темы уже здесь: http://forum.vingrad.ru/index.php?showtopi...t&p=1179611
Есть только 2 способа вставить данные в середину файла: 1. Путем создания временного файла 2. Путем ручного выделения в файле места под новую информацию: а) Используя операции read/write/lseek б) Используя отображение файла в оперативную память (open/mmap/munmap под *nix или OpenFile/CreateFileMapping/MapViewOfFile под Windows) |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Доступ к файлам последовательный, пожно менять позицию....
Этот код должен перемещать позицию и выводить отрезок размером в z а экран Но увы гдето ошибка. Ничего не выводится
Возможно ли пойти таким путем: Переместиться на определенное количество z в файле и записать новое z поверх того что уже записано в этой позиции? Без смещения просто поверх Это сообщение отредактировал(а) ausar - 17.8.2007, 01:32 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
ausar, еще раз для непонятливых - В БИНАРНОМ РЕЖИМЕ НЕТ ПОНЯТИЯ "СТРОКА". И вообще, любой seek оперирует БАЙТАМИ, а не строками.
И вообще, RTFM! Это сообщение отредактировал(а) bsa - 17.8.2007, 09:59 |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Да понятия строк нет. Но ведь можно перемещаться по файлу на определенное количество z назад относительно начала файла. Ведь можно записать поверх одной структуры z другую такого же размера? Или все же нельзя?
P.S И вообще, RTFM!.... Так накой тогда вообще форум нужен. Вопросы, ответы. Заменить тогда его на белую страничку с надписью в уголке ..RTFM товарищ и будет тебе мир и щастье!.. Я же четко написал что на мои вопросы я не могу ответа найти в RTFM приходится то тут то там подчитывать догадывать, сидеть и удивленно хлопать ушами когда компилятор выдаст очередной перл. Это сообщение отредактировал(а) ausar - 17.8.2007, 10:08 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Компиляторы очень редко выдают "перлы". Обычно, они выдают то, что ты их попросил выдать либо ошибку, если оное невозможно.
seek действительно позволяет перемещаться по файлу. Но не по строкам. А по байтам. Более того, что такое 1 в вызове fseek? Есть 3 допустимых значения, SEEK_SET, SEEK_CUR, SEEK_END. Откуда ты взял единицу? Дальше, твоя программа спрашивает "введите строку для отображения" и вводишь номер строки. А затем прыгаешь на i байт, которое равно случайному числу, так как в 3-й строчке ты умножаешь sizeof(z) на неизвестное в данный момент число. И после этого ты обижаешься на компилятор? |
|||
|
||||
| ausar |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 127 Регистрация: 3.8.2007 Репутация: нет Всего: нет |
Более того, что такое 1 в вызове fseek?....
Например: int fseek(FILE *f, long offset, int x); offset показывает, на сколько байт нужно сместиться относительно точки отсчёта – x. x равно одному из этих вот SEEK_SET или 0 - начало файла; SEEK_CUR или 1 – текущая позиция в файле; SEEK_END или 2 – конец файла. fseek(in, i, 1); Или опять не то? |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |