Модераторы: 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   Вверх
MAKCim
Дата 17.8.2007, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(ausar @  17.8.2007,  10:03 Найти цитируемый пост)
Но ведь можно перемещаться по файлу на определенное количество z назад относительно начала файла. Ведь можно записать поверх одной структуры z другую такого же размера? Или все же нельзя?

можно
Код

struct man {
    int age;
    char name[16];
} people[] = {
    {21, "Ivan"},
    {30, "Dima"},
    {29, "Oleg"},
    {15, "Maxim"},
    {18, "Roman"}
};

int main() {
    FILE * fs = fopen(PATH, "rb");
    fwrite(people, sizeof(struct man), sizeof(people) / sizeof(struct man), fs);
    fseek(fs, 3 * sizeof(man), SEEK_SET); /* указатель на "Maxim" */
    fwrite(people + 4, sizeof(struct man), 1, fs); /* стираем "Maxim", записываем "Roman" */
    return 0;
}


Это сообщение отредактировал(а) MAKCim - 17.8.2007, 10:49


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



ausar, если у тебя мало данных (метров 10) вот тебе вариант:

1 - Считываеш все структуры в массив (в память)
2 - добовляеш новые структуры изменяеш
3 - записываеш весть массив в файл

Так делают блокнот ворд и др.

А если данных много используй БД, и храни в ней структуры.

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

А ВООБЩЕ немешало бы говорить, что должно получится а не то, что ты делаеш и оно не получается (особенно если так нельзя).


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


Шустрый
*


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

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



Возможно ли поместить структуру z в переменную как в буфер чтоб потом достть и вставить в нужном месте?.
PM MAIL   Вверх
bsa
Дата 18.8.2007, 10:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ausar @ 18.8.2007,  09:56)
Возможно ли поместить структуру z в переменную как в буфер чтоб потом достть и вставить в нужном месте?.

Именно это ты делаешь, когда ее читаешь из файла.
PM   Вверх
ausar
Дата 18.8.2007, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я имел ввиду считать z из файла затем переписать в другую переменную вроде как отложить про запас. Ведь при считывании следующей структуры предыдущая ястественно не сохраниться
PM MAIL   Вверх
bsa
Дата 18.8.2007, 11:19 (ссылка) |    (голосов:4) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(ausar @ 18.8.2007,  11:08)
Я имел ввиду считать z из файла затем переписать в другую переменную вроде как отложить про запас. Ведь при считывании следующей структуры предыдущая ястественно не сохраниться

Открою тебе огромный секрет. Переменных в программе может быть больше одной.  smile 
PM   Вверх
ausar
Дата 18.8.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ух да неужели! 

В таком случае как поместить структуру z в другую переменную например xz и потом вернуть её обратно в z?
PM MAIL   Вверх
Xenon
Дата 18.8.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



ausar, ?  smile 
Код

struct z 
{
    /* ... */
};
int main(int argc, char argv[]) 
{
    std::ifstream file("...");
    z buf;
    file.read( reinterpret_cast<char*>(&buf), sizeof(z) ); //Считали структуру z из файла :)
    z buf2 = buf; //Поместили структру z в другую переменную :)
    buf = buf2; //Вернули ее обратно в z (только нахрена?) :)
    return 0;
}

тебе не кажется, что ты излагаешь какие-то странные изречения, раз народ на них так реагирует? smile

Это сообщение отредактировал(а) Xenon - 18.8.2007, 16:48


--------------------
user posted image  
PM MAIL   Вверх
dumb
Дата 18.8.2007, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



Цитата(ausar @  18.8.2007,  16:21 Найти цитируемый пост)
Ух да неужели!
В таком случае как поместить структуру z в другую переменную например xz и потом вернуть её обратно в z?
иди букварь читай.
"слабо" только в детском саду работает(да и то не всегда).

Добавлено через 1 минуту и 4 секунды
ой. сработало... smile
PM MAIL   Вверх
MAKCim
Дата 18.8.2007, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата(dumb @  18.8.2007,  16:48 Найти цитируемый пост)
"слабо" только в детском саду работает(да и то не всегда).

 smile 
если что-то интересное, на меня всегда действует  smile 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
JackYF
Дата 18.8.2007, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(MAKCim @  18.8.2007,  17:10 Найти цитируемый пост)
если что-то интересное, на меня всегда действует 

интересное вообще всегда действует, это в нашей природе... и это хорошо.

А вот вопрос я действительно понял так же, как и Xenon smile И не я один...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
GrayCardinal
Дата 19.8.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



Цитата

Открою тебе огромный секрет. Переменных в программе может быть больше одной.  

Это было сильно smile


--------------------
PM MAIL WWW   Вверх
JackYF
Дата 19.8.2007, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

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



Цитата(GrayCardinal @  19.8.2007,  14:10 Найти цитируемый пост)
Это было сильно smile 

ага smile


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Rapalex
Дата 20.8.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(bsa @  18.8.2007,  11:19 Найти цитируемый пост)
Открою тебе огромный секрет. Переменных в программе может быть больше одной.

Это круто, а ещё в программе можно список сделать  smile  Во избежание конфликтов сообщаю - можно самому не парится а взять готову SLT  smile 

Это сообщение отредактировал(а) Rapalex - 20.8.2007, 11:06


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


Эксперт
***


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

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



Rapalex, ага и boots smile


--------------------
user posted image  
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0915 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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