#c #file #unix #binary
#c #файл #unix #двоичный
Вопрос:
У меня есть такая структура людей:
struct patient{
char name[100];
char address[100];
int age;
}
struct patient p1;
int f;
f = open("patients.dat",O_RDWR,S_IRUSR|S_IWUSR);
И я написал двоичный файл, используя f = open …и напишите(f,amp;p1,sizeof(struct patient))
Теперь есть задача, в которой я должен удалить определенных людей из двоичного файла (например, тех, чье имя я ввожу) Я думал о том, чтобы заменить последнего пользователя на того, кого я хочу удалить, но тогда в файле, который нужно удалить, все еще остается последний.
Есть ли какой-нибудь способ удалить это из файла, я не знаю, например, изменить имя, адрес и возраст p1 на ‘ 0’, но это не сработало, он по-прежнему показывает «призрачные» вещи.
Комментарии:
1. Вы не можете удалить данные из файла, если они не находятся в конце файла. Обычно люди пишут новый файл с отредактированными данными.
Ответ №1:
Вы не можете удалять (или добавлять) данные из / в середину файла в POSIX — только в конце. Вы можете перезаписать данные в середине, но это не изменит размер файла.
Поэтому, если вы хотите удалить запись данных из середины, вам нужно перезаписать ее другими данными (возможно, переместив все последующие данные вниз или, возможно, просто скопировав последний элемент), а затем изменить размер, чтобы удалить последний элемент (который теперь является дубликатом).
Вы изменяете размер файла с помощью ftruncate
Комментарии:
1. Мысль
"that does not change..."
->"that can not change..."
2. Итак, если я урежу файл на 1 структуру меньшим числом, то последняя структура будет удалена?
Ответ №2:
И я написал двоичный файл с помощью
f = open...
andwrite(f,amp;p1,sizeof(struct patient))
.
Пожалуйста, прочитайте документацию open(2) и write(2) (а также lseek(2), close(2), ftruncate(2), inode(7), credentials(7) …).
Вам нужно проверить возвращаемое значение open
и write
.
Как и в большинстве других системных вызовов (2). Смотрите также errno (3) и читайте Advanced Linux Programming
Вы могли бы принять соглашение (и задокументировать его): каждая patient
запись (внутри вашего двоичного файла), которая name
начинается с 0 байт, очищается и может быть использована повторно.
Вы также можете рассмотреть возможность использования mmap (2) для доступа к вашему двоичному файлу. Это будет хорошо работать, если ваш двоичный файл не слишком большой (менее нескольких гигабайт в 2020 году). смотрите также этот ответ.
На самом деле, вы могли бы рассмотреть возможность использования некоторой библиотеки базы данных, такой как sqlite. Или какую-нибудь библиотеку индексированных файлов, такую как gdbm.