Работа с файлами и структурами. Удалить запись по ее номеру.
Здравствуйте, не знаю как удалить элемент по заданному номеру. Мы создаем бинарный файл, в консоль заполняем структуру и она записывается в этот новый файл. Теперь нужно сделать так, чтобы по номеру который введет пользователь, была удалена соответсв. запись из файла. У меня не получислось разобраться. Вот сама программа: http://zalil.ru/34576378 не хватает «удаления». Пожалуйста помогите. Здравствуйте, не знаю как удалить элемент по заданному номеру. Мы создаем бинарный файл, в консоль заполняем структуру и она записывается в этот новый файл. Теперь нужно сделать так, чтобы по номеру который введет пользователь, была удалена соответсв. запись из файла. У меня не получислось разобраться. Вот сама программа: http://zalil.ru/34576378 не хватает «удаления». Пожалуйста помогите. И еще такой нюанс: вот например, удалили запись. Как это показать преподавателю? Ведь в бинарном файле одни иероглифы, как проверить удалилось ли именно то, что должно было? 🙂
Отслеживать
141 1 1 золотой знак 2 2 серебряных знака 9 9 бронзовых знаков
задан 12 июн 2013 в 21:46
1 2 2 серебряных знака 3 3 бронзовых знака
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Как правильно решается задача удаления одной записи
- открываем файл на чтение
- открываем ещё один файл на запись (новый, с временным именем)
- счетчик записей = 0
- пока в входном файле есть записи
- читаем одну запись
- увеличиваем счетчик записей на 1
- если значение счетчика не совпадает с номером нужной записи, то прочитанную запись пишем в новый файл (иначе ничего не делаем, тем самым эта запись не попадет в новый файл и по факту будет удалена)
- конец цикла «пока — строка 4»
- закрываем оба файла.
- первый файл удаляем, второй (новый) переименовываем.
Такой алгоритм позволит работать с файлами произвольного размера. В строке 7 алгоритма можно делать свои условия фильтрации.
И еще такой нюанс: вот например, удалили запись. Как это показать преподавателю?
если старый файл не удалять, а к примеру переименовать в «копию», то просто нужно распечатать программой один и другой файл и дать их сличить. При распечатке можно выводить номера записей.
по фразой переименовать в «копию» я понимаю дать просто правильное имя. Если исходный файл данных называется data.dat, то переименовывать можно в data.dat.bak.
Как удалить запись из бинарного файла си
Регистрация: 03.01.2014
Сообщений: 6
сортировка/удаление/редактирование бинарного файла
Люди помогите пожалуйста. В бинарном файле у меня находятся сведения о нуждающихся в пособии. Имеются функции создания\откртия файла, добавление в файл, вывод на экран в виде табл, поиск по ФИО. но сортировка, редактирование и удаление не получаются.
Прошу помощи, помогите написать хотя бы одну из этих функций. очень нужно.
Это часть кода.
struct allowance < char MothFIO[255];// ФИО матери int ChCount;// Количество детей double AllowSize;//Размер пособия >; void CreateFile()//создание\открытие файла < std::cout else strcpy(fname, tmp); fl.close(); > else strcpy(fname, tmp); file.close(); > void AddRec()//добавить запись < if (strcmp(fname, "Не выбран") == 0) < std::cout allowance al; std::fstream file; file.open(fname, std::ios::out | std::ios::app | std::ios::binary); std::cout >al.MothFIO; std::cout > al.ChCount; al.AllowSize = al.ChCount * PSIZE; std::cout
В различных источниках пишут, что нужно создать массив структур, считывать в него все записи из файла. Вот только я не знаю как это правильно написать
Работа с файлами в СИ
Файл – это именованная область данных на каком-либо носителе информации. Типы файлов (относительно языка «СИ»):
текстовые;
бинарные.
Основные операции производимые над файлами:
Открытие файлов.
Чтение и запись данных.
Закрытие файлов.
Дополнительные операции:
Навигация по файлу.
Обработка ошибок работы с файлами.
Удаление и переименование файлов.
Описание переменной
Библиотека stdio.h
FILE *имя = NULL;
Открытие файла
FILE *fopen(const char *filename, const char *mode);
filename – название файла.
mode – режим открытия.
Функция возвращает указатель на файл, если тот был успешно открыт. В противном случае – NULL. Только имя, если файл находится в текущем каталоге. Иначе необходимо указать абсолютный или относительный путь к файлу.
Примеры:
«data.txt”
«..\\files\\data.txt»
«d:\\temp\\data.txt»
Режимы открытия файлов с СИ
| r | только чтение |
| w | Только запись. Если файл существовал, то он переписывается. |
| a | Добавление: открытие файла для записи в конец, или создание файла. |
| r+ | Открывает файл для обновления (чтение и запись). |
| w+ | Открывает файл для обновления (чтение и запись), переписывая файл, если он существует. |
| a+ | Открывает файл для записи в конец файла или для чтения. |
Перенаправление потоков
FILE * freopen(const char *filename, const char *mode, FILE *stream);
Функция возвращает:
Указатель на файл – все нормально,
NULL – ошибка переопределения.
Закрытие файла
int fclose(FILE *stream);
stream — указатель на открытый файл.
Функция возвращает:
0 – файл успешно закрыт.
1 – произошла ошибка закрытия файла.
Проверка на достижение конца файла
int feof(FILE *stream);
stream — указатель на открытый файл.
Функция возвращает:
0 – если конец файла еще не достигнут.
!0 – достигнут конец файла.
Открытие текстовых файлов
Во втором параметре дополнительно указывается символ t (необязательно):
rt, wt, at, rt+, wt+, at+
Чтение из текстового файла
Форматированное чтение
int fscanf(FILE *stream, const char * format, [arg] . );
Функция возвращает:
buffer – все нормально,
NULL – ошибка или достигнут конец файла.
Чтение строки
char * fgets(char * buffer, int maxlen, FILE *stream);
Функция возвращает:
buffer – все нормально,
NULL – ошибка или достигнут конец файла.
Чтение символа
int fgetc(FILE *stream);
Функция возвращает:
код символа – если все нормально,
EOF – если ошибка или достигнут конец файла.
Помещение символа обратно в поток
int ungetc(int c, FILE *stream);
Функция возвращает:
код символа – если все успешно,
EOF – произошла ошибка.
Запись в текстовый файл в СИ
Форматированный вывод
int fprintf(FILE *stream, const char *format, [arg] . );
Функция возвращает:
число записанных символов – если все нормально,
отрицательное значение – если ошибка.
Запись строки
int fputs(const char *string, FILE *stream);
Функция возвращает:
число записанных символов – все нормально,
EOF – произошла ошибка.
Запись символа
int fputc(int c, FILE *stream);
Функция возвращает:
код записанного символа – все нормально,
EOF – произошла ошибка.
Открытие бинарных файлов
Во втором параметре дополнительно указывается символ b (обязательно):rb, wb, ab, rb+, wb+, ab+
Чтение из бинарных файлов
size_t fread(void *buffer, size_t size, size_t num,FILE *stream);
Функция возвращает количество прочитанных блоков. Если оно меньше num, то произошла ошибка или достигнут
конец файла.
Запись в бинарный файл
size_t fwrite(const void *buffer, size_t size, size_t num, FILE *stream);
Функция возвращает количество записанных блоков. Если оно меньше num, то произошла ошибка.
Навигация по файлу
Чтение текущего смещения в файле:
long int ftell(FILE *stream);
Изменение текущего смещения в файле:
int fseek(FILE *stream, long int offset, int origin);
SEEK_SET (0) – от начала файла.
SEEK_CUR (1) – от текущей позиции.
SEEK_END (2) – от конца файла.
Функция возвращает:
0 – все нормально,
!0 – произошла ошибка.
Перемещение к началу файла:
void rewind(FILE *stream);
Чтение текущей позиции в файле:
int fgetpos(FILE *stream, fpos_t *pos);
Установка текущей позиции в файле:
int fsetpos(FILE *stream, const fpos_t *pos);
Функции возвращают:
0 – все успешно,
!0 – произошла ошибка.
Структура fpos_t:
typedef struct fpos_t long off;
mbstate_t wstate;
> fpos_t;
Получение признака ошибки:
int ferror(FILE *stream);
Функция возвращает ненулевое значение, если возникла ошибка.
Функция сброса ошибки:
void clearerr(FILE *stream);
Функция вывода сообщения об ошибке:
void perror(const char *string);
Буферизация
Функция очистки буфера:
int fflush(FILE *stream);
Функция возвращает:
0 – все нормально.
EOF – произошла ошибка.
Функция управления буфером:
void setbuf(FILE *stream, char * buffer);
Создает буфер размером BUFSIZ. Используется до ввода или вывода в поток.
Временные файлы
Функция создания временного файла:
FILE * tmpfile(void);
Создает временный файл в режиме wb+. После закрытия файла, последний автоматически удаляется.
Функция генерации имени временного файла:
char * tmpnam(char *buffer);
Удаление и переименование
Функция удаления файла:
int remove(const char *filename);
Функция переименования файла:
int rename(const char *fname, const char *nname);
Функции возвращают:
0 – в случае успеха,
!0 – в противном случае.
Как удалить запись из двоичного файла?
Подскажите пожалуйста, как можно из бинарного файла, в котором находяться записи вида struct
2 ответа
02 мая 2004 года
3.2K / / 06.03.2004
Originally posted by alexx
Подскажите пожалуйста, как можно из бинарного файла, в котором находяться записи вида struct (например) удалить одну из записей. При этом, т.к. размер файла большой, то варианты с полным считыванием файла в строку и последующим ее редактированием не подходят.
Ну, батенька, тогда уже никак. Придется, скорее всего «удалять» запись на логическом уровне, помечая ее как удаленную, но не удаляя из файла физически. Например, так делает DBF.
03 мая 2004 года
7.3K / / 20.01.2000
Originally posted by alexx
Подскажите пожалуйста, как можно из бинарного файла, в котором находяться записи вида struct (например) удалить одну из записей. При этом, т.к. размер файла большой, то варианты с полным считыванием файла в строку и последующим ее редактированием не подходят.
А причем здесь строка? Создай временный файл и считай туда все данные которые не должны быть удалены — а потом замени исходный файл и удали временный. Все. Используя файловые потоки — строк 10 кода. Готовый код я выкладывал на форум, в подобной теме, используй поиск.