Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Структура и файл


Автор: HELPER 15.5.2005, 12:31
Как удалить структуру из файла (без использования еще одного файла).
Короче:

Код

struct s {
int a, b, c;
};
//--------
FILE *f;
f = fopen("bla.bla","rb+");
//запись нескольких s в файл с помощью fwrite

//а тут надо удалить структуру по ее номеру...


Ненадо кода писать, просто дайте какунить наводку, или функцию, которая ета сделает...

Автор: kometa_triatlon 15.5.2005, 13:13
Ну удобнее всего переписать в другой файл конечно без этой структуры.
Если оперативка позволяет, можно считать весь файл в массив структур, а потом в этот же файл и записать, опять же без одной структуры.

Если так не хочешь, есть вариант, предложенный Дейтелом:
Вобщем сразу создается файл примером на 100 структур. И записывается 100 ПУСТЫХ структур. Если это число, значит 0, если строка, то пустая.
Ну и при считывании это надо учитывать: игнорировать такие пустые структуры. Тогда удобно работать с любой частью файла. Если надо добавить 20-ую структуру, которой "типа" не было, переходим на нее и записываем нужную инфу. Если нужно удалить, записываем поверх удаляемой пустую. Если нужно добавить новую с номером 120, добавляем еще 19 пустых структур и 120-ую с инфой. Ну вобщем так. Если место на винте позволяет, и мало таких пропусков, то очень удобно. Все-таки, если файлы по 50 метров и нужно удалить одну структуру, то вариант с переписыванием файла в новый и переименованием в новый не канает smile

Автор: HELPER 15.5.2005, 13:47
Елки, а помоему как-то подругому можно... smile
Например в паскале есть функция truncate - она все от файлового указателя до конца стирает....
А в С альтернативы нет-что ли??? smile

Автор: HELPER 15.5.2005, 16:29
аааааааааааааааа!! smile
Где ответы? - нету...
Где советы? - тоже нету....
Где все хорошие прграммисты??? - ...

Что никто не знает как удалить структуру???

Автор: kometa_triatlon 15.5.2005, 20:59
Так что тебе даст truncate? Это если только последнюю структуру удалить нужно. А если любую?

Цитата
Где ответы? - нету...
Где советы? - тоже нету....
Где все хорошие прграммисты??? - ...

Смотри выше smile

Автор: HELPER 16.5.2005, 08:26

Цитата(kometa_triatlon @ 15.5.2005, 20:59)
Так что тебе даст truncate?


Как-ето что даст???? smile smile smile

Сдвигать каждую i на i-1 а потом удалить последнюю...
Короче:
Файл: (в нем структуры)
s1, s2, s3, s4, s5, s6,s7
Надо удалить s3:

s1,s2, s3<-s4, s4<-s5, s5<-s6, s6<-s7, s7

Потом указатель на последнюю, и truncate...

Файлов в 50 кг не будет так-что для данной задачи способ рациональный, наверно smile

Автор: _hunter 16.5.2005, 12:22
HELPER, она и в С есть smile
int truncate (const char*filename, off_t length);

Автор: HELPER 16.5.2005, 14:18
Спасибо
_hunter
слепой я балбес... =))
Добавлено @ 14:24
хотя....чето библиотека у нее какая??, а то что-то
function truncte must have a prototype... smile

Автор: _hunter 16.5.2005, 15:48
упс... она самописная...
вот темы:
http://forum.vingrad.ru/index.php?showtopic=38694
http://forum.vingrad.ru/index.php?showtopic=35612

Автор: HELPER 16.5.2005, 19:46
Да уж... smile
А если сделать надо в досе?? т.е. в BC, TC.... smile smile smile
Уже 10 дней инфу ищу.....

Автор: Artemon 20.5.2005, 15:02
Если ты говоришь, что 50кг инфы не будет, то надо считывать все структуры из файла в массив структур, а затем записывать все эти структуры, за исключением ненужной обратно в файл.

Автор: HELPER 20.5.2005, 19:34
Ну да, дельный совет...особенно, когда
_hunter
уже все сказал и расписал и ссылки дал... =)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)