Здравствуйте, не знаю как удалить элемент по заданному номеру. Мы создаем бинарный файл, в консоль заполняем структуру и она записывается в этот новый файл. Теперь нужно сделать так, чтобы по номеру который введет пользователь, была удалена соответсв. запись из файла. У меня не получислось разобраться... Вот сама программа: http://zalil.ru/34576378 не хватает "удаления". Пожалуйста помогите.
Здравствуйте, не знаю как удалить элемент по заданному номеру. Мы создаем бинарный файл, в консоль заполняем структуру и она записывается в этот новый файл. Теперь нужно сделать так, чтобы по номеру который введет пользователь, была удалена соответсв. запись из файла. У меня не получислось разобраться... Вот сама программа: http://zalil.ru/34576378 не хватает "удаления". Пожалуйста помогите.
И еще такой нюанс: вот например, удалили запись. Как это показать преподавателю? Ведь в бинарном файле одни иероглифы, как проверить удалилось ли именно то, что должно было? :)
Как правильно решается задача удаления одной записи
Такой алгоритм позволит работать с файлами произвольного размера. В строке 7 алгоритма можно делать свои условия фильтрации.
И еще такой нюанс: вот например, удалили запись. Как это показать преподавателю?
если старый файл не удалять, а к примеру переименовать в "копию", то просто нужно распечатать программой один и другой файл и дать их сличить. При распечатке можно выводить номера записей.
по фразой переименовать в "копию" я понимаю дать просто правильное имя. Если исходный файл данных называется data.dat, то переименовывать можно в data.dat.bak.
Для записей фиксированного размера можно и "по месту" удалять. Открываете файл на чтение-запись. Вычисляете смещения откуда читать и куда писать (исходя из размера записи и ее номера).
Потом в цикле seek, read, seek, write ... до конца файла. После цикла урезаете файл.
Если задать в аргументах смещение и размер удаляемого участка, то требование фиксированного размера записей уже не нужно.
В общем, примерно так:
int
rewrite (FILE *f, off_t to, off_t from, off_t end)
{
char buf[4096];
int l;
while (from < end) {
fseek(f, from, SEEK_SET);
l = fread(buf, 1, 4096, f);
if (l < 0)
return l;
from += l;
fseek(f, to, SEEK_SET);
if (fwrite(buf, 1, l, f) != l)
return -1;
to += l;
}
return l;
}
.....
FILE *f = fopen(filename, "r+");
if (!f)
fatal(filename);
struct stat st;
fstat(fileno(f), &st);
off_t to = reclen * recno,
from = to + reclen;
if (from > st.st_size) {
printf ("%s size: %ld too small for delete record %d (%d length)\n",
filename, st.st_size, recno, reclen);
Usage();
}
if (rewrite(f, to, from, st.st_size) < 0)
fatal("rewrite");
fflush(f);
ftruncate(fileno(f), st.st_size - reclen);
fclose(f);
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Привет, ребят! У меня вопросПочему в коде ниже place_number в конце равен коду последнего символа?
Не могу понять зачем такое объединение двух объектов разного или одного типа, в один объект? И чем это отличается от map? И как или какой смысл...
Только начал изучать С++, возникла сложностьНеобходимо присвоить определенному элементу массива значение