Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с файлами в бинарном режиме. Вопросы без от 
:(
    Опции темы
ausar
Дата 15.8.2007, 09:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Работа с файлами в бинарном режиме. Вопросы без ответов в литературе

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

1. Как удалить строку из файла
2. Возможно ли  удалить определенную строку в файле (например вторую сверху или третью снизу)
3. Возможно ли просто вписать строку между 1 и 2 например чтоб остальные просто сдаивнулись вниз
4. Можно ли както обозначить конец строки кроме \n



 
PM MAIL   Вверх
Fazil6
Дата 15.8.2007, 09:22 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



в бинарном режиме нет строк
PM MAIL   Вверх
_hunter
Дата 15.8.2007, 10:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



все это делается одним и тем же способом: создаем временный файл; пишем туда (читая из первого файла) все, что до целевой строки (места с которого ходим удалять/куда хотим добавлять); пишем добавляемую строку во временный файл/пропускаем удаляемую строку в первом файле; продолжаем читать/записывать. все.
строки искать придется самому (симолы \r/\n)
обозначать, в таком режиме, строку можно хоть буквами "зю" -- главное стобы ты об этом помнил (и чтобы в файле не встречалось "левых" букв зю)...


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
ausar
Дата 16.8.2007, 07:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Чтож пойдем другим путем.
Например. Имеется структура z
И вот такой фрагмент кода выполняющий возврат на sizeof(z) байт назад. Возможно ли таким же образом перемещаться на 2 или 10 sizeof(z) байт назад. Что модифицировать?

Код

 i=sizeof(z);
       fseek(in, -i, 1); // возврат на sizeof(z) байт назад
      fwrite(&z,sizeof(z),1,in) //запись размером с z

PM MAIL   Вверх
Shaggie
Дата 16.8.2007, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



ausar, вопросик "не бей лежачего"... заведи переменную n=1, на сколько sizeof надо вернуться - такое число пиши в n
Код

int n=1
int i=n*sizeof(z);



--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
ausar
Дата 16.8.2007, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Вопросик очень важный для меня и ответ как раз то что я ожидал но догадаться увы не мог.
Спасибо!
PM MAIL   Вверх
Rapalex
Дата 16.8.2007, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: нет
Всего: 8



ausar, ты хочеш в файл записать массив структур?


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
ausar
Дата 16.8.2007, 14:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Нет я хочу научиться редактировать файл в бинарном режиме но нигде не описаны приемы. например как перемещаться по файлу. Как удалить строку. Как скопировать структуру z в temp чтоб потом вставить в другом месте 
Вот что я сваял, компилятор не ругается! В идеале введя номер записи напр 2 выводится 2 запись.
Но кроме черного экрана я пока ничего не добился :(

Код

void choose(FILE *in)
{int n;
long int i=n*sizeof(z);
in=fopen("file.txt","rb+"); // открытие файла чтения
fseek(in, 0, 1);
printf("Введите строку для отображения");
scanf("%d",n);
fseek(in, i, 1);
fread(&z,sizeof(z),1,in);
{printf("\n %d name %s surename %f number %d", i, z.name, z.sur, z.nom);
}
}

PM MAIL   Вверх
Rapalex
Дата 16.8.2007, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 732
Регистрация: 20.1.2006
Где: Украина -> Ник олаев

Репутация: нет
Всего: 8



Доступ к файлам последовательный, пожно менять позицию но в центре файла добавить строку так чтоб все остальные сместились НЕВОЗМОНО.


--------------------
In vitium ducit culpae fuga.
Желание избежать ошибки вовлекает в другую.
(Horatius)
PM ICQ   Вверх
bsa
Дата 16.8.2007, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 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)
PM   Вверх
ausar
Дата 17.8.2007, 01:30 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Доступ к файлам последовательный, пожно менять позицию....

Этот код должен перемещать позицию и выводить отрезок размером в z а экран
Но увы гдето ошибка. Ничего не выводится

Код

void choose(FILE *in)
{int n;
long int i=n*sizeof(z);
in=fopen("file.txt","rb+"); // открытие файла чтения
fseek(in, 0, 1);
printf("Введите строку для отображения");
scanf("%d",n);
fseek(in, i, 1);
fread(&z,sizeof(z),1,in);
{printf("\n %d name %s surename %f number %d", i, z.name, z.sur, z.nom);
}
}


Возможно ли пойти таким путем:
Переместиться на определенное количество z в файле и записать новое z поверх того что уже записано в этой позиции? Без смещения просто поверх

Это сообщение отредактировал(а) ausar - 17.8.2007, 01:32
PM MAIL   Вверх
bsa
Дата 17.8.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



ausar, еще раз для непонятливых - В БИНАРНОМ РЕЖИМЕ НЕТ ПОНЯТИЯ "СТРОКА". И вообще, любой seek оперирует БАЙТАМИ, а не строками.
Цитата(man 3 fseek)
SYNOPSIS
       int fseek(FILE *stream, long offset, int whence);
DESCRIPTION
       The  fseek()  function  sets the file position indicator for the stream
       pointed to by stream.  The new position, measured in bytes, is obtained
       by  adding offset bytes to the position specified by whence.  If whence
       is set to SEEK_SET, SEEK_CUR, or SEEK_END, the offset  is  relative  to
       the  start of the file, the current position indicator, or end-of-file,
       respectively.

И вообще, RTFM!

Это сообщение отредактировал(а) bsa - 17.8.2007, 09:59
PM   Вверх
ausar
Дата 17.8.2007, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 127
Регистрация: 3.8.2007

Репутация: нет
Всего: нет



Да понятия строк нет. Но ведь можно перемещаться по файлу на определенное количество z назад относительно начала файла. Ведь можно записать поверх одной структуры z другую такого же размера? Или все же нельзя?

P.S И вообще, RTFM!....

Так накой тогда вообще форум нужен. Вопросы, ответы. Заменить тогда его на белую страничку с надписью в уголке ..RTFM товарищ и будет тебе мир и щастье!..

Я же четко написал что на мои вопросы я не могу ответа найти в RTFM приходится то тут то там подчитывать догадывать, сидеть и удивленно хлопать ушами когда компилятор выдаст очередной перл.

Это сообщение отредактировал(а) ausar - 17.8.2007, 10:08
PM MAIL   Вверх
bsa
Дата 17.8.2007, 10:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Компиляторы очень редко выдают "перлы". Обычно, они выдают то, что ты их попросил выдать либо ошибку, если оное невозможно.
seek действительно позволяет перемещаться по файлу. Но не по строкам. А по байтам. Более того, что такое 1 в вызове fseek? Есть 3 допустимых значения, SEEK_SET, SEEK_CUR, SEEK_END. Откуда ты взял единицу? Дальше, твоя программа спрашивает "введите строку для отображения" и вводишь номер строки. А затем прыгаешь на i байт, которое равно случайному числу, так как в 3-й строчке ты умножаешь sizeof(z) на неизвестное в данный момент число. И после этого ты обижаешься на компилятор?
PM   Вверх
ausar
Дата 17.8.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 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);


Или опять не то?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0562 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.