Удалить запись из файла
Ребята! Помогите, пожалуйста, разобраться. Я понимаю, вещь простейшая, но до меня почему-то не доходит.
Нужно удалить запись из типизированного файла, предварительно вывести ее на экран. При этом нужно использовать дополнительный файл. Но как его объявлять, если он пустой, записей в нем нет?
4 ответа
Так же и объявлять.Все типизированные файлы были когда-то пустыми,но ведь их как-то заполнили!:)
В дополнительный файл записываешь информацию ДО удаляемой записи,выводишь её и записываешь информацию ПОСЛЕ неё,а потом,само собой,заменяшь старый файл новым
PROGRAM EXAMPLE;
TYPE
WER=RECORD
ZACH, GRYP, SEM, PRED, KONTR, BAL:INTEGER;
END;
VAR
ZAPIS: WER;
KRAB: FILE OF WER;
NOVFILE: FILE OF WER;
FLAG: BOOLEAN;
FILENAME, IMFILE: STRING;
AV: STRING;
BEGIN
REPEAT
FLAG:=TRUE;
WRITELN('ВВЕДИТЕ ИМЯ ФАЙЛА НА ДИСКЕ'); READLN(FILENAME);
ASSIGN (KRAB,FILENAME);
RESET(KRAB);
IF IORESULT=0
THEN BEGIN
WRITELN('ФАЙЛ "',FILENAME,'" УЖЕ ЕСТЬ');
CLOSE(KRAB);
FLAG:=FALSE
END
ELSE BEGIN
REWRITE(KRAB);
FLAG:=TRUE
END
UNTIL FLAG;
REPEAT
WRITELN('ПУНКТ 1 '); READLN(ZAPIS.ZACH );
WRITELN('ПУНКТ 2 '); READLN(ZAPIS.GRYP);
WRITELN('ПУНКТ 3 '); READLN (ZAPIS.SEM);
WRITELN('ПУНКТ 4 '); READLN (ZAPIS.PRED );
WRITELN('ПУНКТ 5'); READLN(ZAPIS.KONTR );
WRITELN('ПУНКТ 6'); READLN(ZAPIS.BAL );
WRITE (KRAB, ZAPIS);
WRITELN('ХОТИТЕ ДОБАВИТЬ ЕЩЕ ОДНУ ЗАПИСЬ ? ( Y/ N )');
READLN(AV);
UNTIL ( AV = 'Y' );
CLOSE(KRAB);
REPEAT
FLAG:=TRUE;
WRITELN('ВВЕДИТЕ ИМЯ ФАЙЛА НА ДИСКЕ');
READLN(IMFILE);
ASSIGN (NOVFILE,IMFILE);
REWRITE(NOVFILE);
RESET(NOVFILE);
IF IORESULT=0
THEN BEGIN
WRITELN('ФАЙЛ "',IMFILE,'" УЖЕ ЕСТЬ');
CLOSE(NOVFILE);
FLAG:=FALSE
END
ELSE BEGIN
REWRITE(NOVFILE);
FLAG:=TRUE
END
UNTIL FLAG;
RESET(KRAB);
REWRITE (NOVFILE);
REPEAT
READ(KRAB,ZAPIS);
WRITELN(
ZAPIS.ZACH:5,
ZAPIS.GRYP:5,
ZAPIS.SEM:5,
ZAPIS.PRED:5,
ZAPIS.KONTR:5,
ZAPIS.BAL:5);
WRITELN;
WRITELN (' ВЫ ХОТЕТЕ УДАЛИТЬ ЗАПИСЬ?');
READLN(AV);
IF (AV='Y') OR (AV='y') THEN WRITE (NOVFILE, ZAPIS);
UNTIL EOF(KRAB);
CLOSE(KRAB);
CLOSE(NOVFILE);
ERASE (KRAB);
RENAME (FILENAME,NOVFILE);
RESET(KRAB);
REPEAT
READ(KRAB,ZAPIS);
WRITELN(ZAPIS.ZACH:5, ZAPIS.GRYP:5, ZAPIS.SEM:5, ZAPIS.PRED:5, ZAPIS.KONTR:5, ZAPIS.BAL:5);
READLN;
WRITELN
UNTIL EOF(KRAB);
CLOSE(KRAB);
END.
Здравствуйте! Я хотел бы узнать, возможно ли удалить запись из типизированного файла без перезаписи?
Так же мне необходимо реализовать редактирование записи, что, конечно же, хотелось бы сделать без полной перезаписи.
PS Дело в том, что задание гласит "При удалении записи реализовать минимальное изменение содержимого файла", по этому полная перезапись, как я полагаю, не подходит.
Заранее спасибо за ваши ответы
Удаление записи из типизированного файла (StringGrid)
Подскажите, пожалуйста, как удалить запись по номеру? Сам пробовал, но после удаления (при попытке.
Удаление записи из типизированного файла по ID
Вот процедура удаления по ID, из типизированного файла. Почему функция Pos не работает? выдает.
Удаление записи из типизированного файла.
Какими способами можно реализовать данную задачу? Из типизированного файла нужно удалить запись.
Добавление, редактирование и удаление записи из файла
Помогите решить пожалуйста 3 вариант задачи, не могу ни как понять. В лабораторной работе.
Можно.Можно по номеру записи или по значению одного или нескольких полей.
Общий принцип удаления такой(это в Паскале, но суть не меняется)
Написано же, минимальные изменения. А "поджим хвоста" равносилен полной перезаписи.
Если речь идёт о записях то есть элементов постоянной длины, а их последовательность не играет роли то достаточно последний элемент поставить на место удаляемого и ограничить размер файла.
Можно сделать и вообще не удаляя, если организовать последовательный список. То есть первый элемент в записи сделать ссылкой на следующую запись.Тогда достаточно в предыдущем удаляемому элементу месте ссылки перезаписать адрес на следующую за удаляемой запись. В принципе можно обнулить весь элемент, если данные представляют важность, а в месте ссылки поставить специальный код, что запись стёрта. Но Это так называемое "псевдоудаление" и это должна учитывать программа, работающая с записями.
Если речь идёт о записях то есть элементов постоянной длины, а их последовательность не играет роли то достаточно последний элемент поставить на место удаляемого и ограничить размер файла.
т.е. по сути отредактировать удаляемую запись, которая находится, например, по середине?
Как отредактировать без перезаписи файла?)
Ну редактировать не труднее. Вы просто вычисляете позицию нужной записи в файле и считываете её.
Все данные окажутся в записи. А далее дело техники.
Скажем у вас запись RR
В ней 2 элемента
Name
age
и вспомогательные переменные.
SS для строки
DD для числа
ну вот и меняем
И опять берём позицию записи и записываем запись на место.
Только вот делать редакторы в консоли - убийство.
Добавлено через 7 минут
У вас должно быть общее меню.
1 Создать
2 Редактировать
3 Выход
Здравствуйте, меня интересует такой вопрос - как удалить определённую строку из файла, если я знаю
её номер ?
Удаление и редактирование определённой строки
Задание- словарь синонимов, в нём нужно осуществить удаление и редактирование определённой строки в.
Удаление из файла определенной записи
Новые записи сохраняются в файле нормально, а вот как удалить определённую запись не могу понять.
Удаление строки из файла\либо удаление самого файла.
День добрый, вот функция(используемые переменные объявленны ранее): void delete_cruise() < FILE.
Удаление определенной строки из Memo
Прювэд народ. Подскажите как из Memo удалять строки начинающиеся с определенного символа.
Нельзя просто из файла удалить строку (если она не последняя, иначе, точно не помню, вроде можно файл урезать), придется записывать в новый файл все, за исключением этой строки.
Одним из решений этой ситуации можно использовать построчное считывание данных из файла по строкам.
Вот краткий пример. (P.S я его не компилил, сейчас просто негде и поэтому возможны опечатки)
Я его не компилил , сейчас просто негде, пишу с планшета. Должно работать, хотя написанный код скорее всего не является оптимальным решением про производительности!
Решение
stawerfar, большое спасибо, сейчас буду тестить
Добавлено через 45 минут
stawerfar, всё очень хорошо работает . Эх. даже стыдно просить . можешь модифицировать свой код так, чтобы он не просто удалял строку, а и заменял её на ту, которую введет пользователь ?
У меня не получается, я вить только недавно начал программировать и не понимаю некоторые части кода.
file_out.write(line_file_text.c_str(), line_file_text.size());
file_out.clear();
А как можно сделать удаление, но не по номеру, а по содержимому?
Добавлено через 37 секунд
я просто написал программу, но результата нету
Удаление определенной строки из файла
Хаи гайсы. Объясняю ситуацию. У меня есть текстовый файл. При работе он будет большим, в ней.
Удаление определённой строки из .txt
Искал на форуме, так должного ответа и не нашёл. Как из .txt удалить определённую строку.
Удаление текста до определенной строки
Есть TextBox, который содержит в себе следующие данные: Сравнить Сравнить . Машина.
Удаление из строки определенной ее части
Всем привет! Подскажите пожалуйста, каким образом можно удалить из строки известную часть. вообще.
Вечер добрый!
Хочу обратиться к вам с такой проблемой:
1)Не могу разобраться с удалением какой-либо записи из файла.
2)Сортировка записей в файле данных по определенному ключу.
Я только начинаю изучать паскаль и некоторые моменты мне пока не понятны!
Понимание, конечно,приходит,но с опозданием.А иногда эта задержка черевата последствиями(для студентов конечно. ).
Если есть возможность помогите .
P.S.:Прилагаю файл-исходник Books_of_. (.Pas фаил переименнованный в .txt для того что-бы вы могли посмотреть исходник)
и файл Книги.txt (Содержиться информация о книгах в библиотеке)созданный через эту же программу.
если по условиям задачи Ваш типизированный файл помещается в память (например, в массив записей), то задача сводится к элементарной:
считываем полностью файл в array[1..МаксимальноВозможноеКоличествоЗа писей] of TMyRecord;
сортируем этот массив.
записываем отсортированный массив в файл, либо в новый, либо в старый (в этом случае лучше исходный файл при этом переименовывать в имя.BAK)
всё.
если же файл по каким-либо причинам нельзя считывать в память - то тогда это намного сложнее. погуглите по словам "внешняя сортировка"
Чего-то я немножко недопонял из выше сказанного!!
А файл(Мною созданный)Содержит информацию о книгах и включает в себя:
1) Удк;
2)Фамилию и инициалы автора;
3)Название книги;
4)Год издания;
5)Количество экземпляров в библиотеке
Эти пять позиций для каждой книги.
и надо отсортировать их по году издания!
вот начальный текст программы,где указываються типы переменных в записи!!
просто везде пишут по разному:где-то надо метки какието ставить,гдето динамические файлы реализовывать.
за ранее благодарен.
ладно. спрошу по простому - СКОЛЬКО МАКСИМАЛЬНО КНИЖЕК МОЖЕТ БЫТЬ В ВАШЕМ ФАЙЛЕ (BookFile:file of Books; ) ??
Т.е. можно ли считать, что у Вас не может быть больше, чем, скажем 900 книг (к сожалению, для DOS TurboPascal есть ограничение на сегмент данных, и для Вашей структуры записи более 950 записей в памяти не поместятся).
Если ограничение устраивает. тогда всё просто:
Дальше сортируйте BookArr (любым способом, хоть тем же "пузырьком") - и записывайте полученный массив в файл.
Дело в том, что Файл уже создан и содержит пока 4-ре записи,но будет дополняться педагогом(Для проверки работоспособности программы);
получается надо
1) (BookArr : array[1..900] of Books ввести в описание основной программы как переменну или же обозначить ее уже в самой процедуре?
если в процедуре тогда туда-же надо вводить переменную BookCount(Это как я понимаю счетчик записей)
вообщем вот это текст программы,две последние процедуры(Если их можно так назвать) -это я пробовал чтонибудь сделать ссортировкой.
uses
crt;
type
Books=record
Udk:integer;
Fio:string[30];
Nazv:string[30];
God_Izd:word;
Kol_Ekz:word;
end;
var
BookFile:file of Books;
Work:Books;
Vid:byte;
End_Menu:boolean;
Name:string[15];
BookArr:array[1..10] of Books;//эту запись я ввел после прочтения вашего ответа,Но не уверен в правильности своего ввода!!
procedure Name_File;
begin
writeln('Введите имя файла');
readln(Name);
end;
procedure AddRec;
begin
Writeln ('Ввод записи №',FilePos(BookFile)+1);
with Work do
begin
write ('Введите Удк');
readln (Udk);
Write ('Введите Фамилию и инициалы ');
readln (Fio);
write ('Введите название ');
readln (Nazv);
write ('‚Введите год издания ');
readln (God_Izd);
write ('‚Кколичество Экз_ов');
readln (Kol_Ekz);
write (BookFile,Work);
end;
end;
procedure Create_book_Of_Lib;
var
ind,count : integer;
begin
name_file;
assign (bookfile, name);
rewrite (bookfile);
writeln ('создание файла записи ',Name);
write ('введите кол-во записей ');
readln (count);
for ind:= 1 to count do
addrec;
writeln('создание файла завершенно');
writeln('Файл содержит ',filesize(bookfile),' записей');
close(bookfile);
end;
procedure OutputRec;
begin
read(bookfile, work);
with work do
begin
writeln('Запись № :', FilePos(bookfile));
writeln('Удк :',Udk);
writeln('Фио :',Fio);
writeln('Название :',Nazv);
writeln('Год :',God_Izd);
writeln('Кол-во Экз :',Kol_Ekz);
end;
end;
procedure OutputAllrec;
begin
Name_File;
Assign(BookFile,Name);
Reset(BookFile);
if IOresult=0 then
begin
Seek(Bookfile,0);
writeln('*** Вывод данных',Name,' ***');
while (not Eof(BookFile)) do
OutputRec;
end
else
writeln('Файла с именем',Name,' не существует');
end;
Procedure UpdateRec;
var
NumRec:longint;
begin
Name_File;
Assign(BookFile,Name);
Reset(BookFile);
if IOresult=0 then
begin
Write('Введите номер изменяемой записи');
Readln (NumRec);
Seek(BookFile,NumRec-1);
writeln('--старое значение записи--');
OutputRec;
Seek(BookFile,NumRec-1);
writeln('задаем новое значение ',NumRec,' записи');
AddRec;
Close(BookFile);
end
else
writeln('Файла с именем '+Name+' не существует');
end;
procedure addrectoend;
begin
name_file;
assign(bookfile, name);
reset(bookfile);
if ioresult = 0 then
begin
seek(bookfile,filesize(bookfile));
addrec;
Writeln('Измененый файл имеет',filesize(bookfile), ' записи');
close(bookfile);
end
else
writeln('Файла с именем'+Name+' на диске нет');
end;
procedure Del_Rec;
var NumRec:integer;
begin
Assign(BookFile,'книги.txt');
reset(BookFile);
If IOresult=1 then
begin
writeln('Ошибка');
end
else
writeln('Введите номер удаляемой записи');
Read(NumRec);
begin
if NumRec>FileSize(BookFile) then
begin
writeln('Такой записи не существует');
end
else
begin
Seek(BookFile,FileSize(BookFile)-1);
read(BookFile,work);
Seek(BookFile,NumRec-1);
write(BookFile,Work);
Seek(BookFile,FileSize(BookFile)-1);
truncate(BookFile);
Writeln('Запись стерта ');
writeln('Файл данных имеет ',FileSize(BookFile),' записей');
close(BookFile);
end;
end;
begin
Name_File;
Assign(BookFile,Name);
reset(BookFile);
writeln('—вҐ*ЁҐ д ©« § ЇЁбҐ©');
while Not (Eof(BookFile)) do
begin
read(BookFile,Work);
inc(Count);
writeln('‚ д ©«Ґ ᮤҐа¦Ёвмбп ',Count,' § ЇЁбҐ©');
writeln('” ©« ¤® б®авЁа®ўЄЁ');
Seek(BookFile,0);
for i := 1 to Count do
begin
read(BookFile,Work);
writeln(Work.God_Izd);
end; >
< Procedure Sort_God; // это тоже не понятно что получилось
var
Stop:boolean;
k:integer;
begin
assign(BookFile,Name);
reset(BookFile);
while Not Eof(BookFile) do
begin
repeat
Stop := true;
for k := 1 to 3 do
if BookArr[k].God_Izd > BookArr[k+1].God_Izd then
begin
work := BookArr[k];
BookArr[k] := BookArr[k+1];
BookArr[k+1] := work;
Stop := false
end
until Stop;
Create_book_Of_Lib;
end;
end; >
begin
ClrScr;
End_Menu:=false;
repeat
writeln('*** ’Ґ«Ґд®**л© бЇа ў®з*ЁЄ ***');
writeln('1 - ᮧ¤ *ЁҐ *®ў®Ј® д ©« ');
writeln('2 - Їа®б¬®ва д ©« ');
writeln('3 - Ё§¬Ґ*ҐЁҐ ¤ **ле');
writeln('4 - ¤®Ї®«*Ґ*ЁҐ д ©« ');
writeln('5 - Ї®ЁбЄ Ї® д ¬Ё«ЁЁ');
writeln('7 - “¤ «Ґ*ЁҐ § ЇЁбЁ');
writeln('6 - ‘®авЁа®ўЄ Ї® Ј®¤г Ё§¤ *Ёп');
writeln('0 - ‡ ўҐаиҐ*ЁҐ а Ў®вл.');
writeln('‚ и ўлЎ®а');
readln(Vid);
case Vid of
1:Create_Book_Of_Lib;
2:OutputAllRec;
3:UpdateRec;
4:AddRecToEnd;
5:FindFio;
6:Sort_God;
7:Del_Rec;
0:End_Menu:=True;
end;
writeln('„«п Їа®¤®«¦Ґ*Ёп * ¦¬ЁвҐ Enter');
readln;
ClrsCR
UNTIL End_Menu;
end.
вот такой исходник!!
не могу пока въехать!)
буду конечно сейчас искать да пробовать сам,почитаю мануалы!
За Инфу спасибо. за помощь то же!
Скорее всего где-то что то не дописал ,не доглядел ну и не додумал конечно!!
например я хочу удалить от туда запись Bobik или любую другую .
как можно сделать ? может сущетвует кой алгоритм удаления или надо мудрувать ?
Алгоритм зависит от того, по каким критериям ты будешь удалять запись: по номеру или по совпадению строк
Так что давай конкретнее
Алгоритм зависит от того, по каким критериям ты будешь удалять запись: по номеру или по совпадению строк
Так что давай конкретнее
впринцыпе все равно:p и вариант с удалением по сурагатному ключу или по совпаденю строк подходит
using namespace std;
int main()
ifstream in ("test.dat", ios::in);
ofstream out("test.new", ios::out);
char buff[256];
int num,i;
max_dark спасибо за код.
я наверлно не правильно обяснил, по номеру строки не подходит.
лучше уж по совпадению строки:)))
m_Valery Спасибо :)
с кодом разобрался, только не смог асилить что значит это:
Можешь вместо int _tmain(int argc, _TCHAR* argv[]) использовать
int main().int argc и _TCHAR* argv[]) - параметры командной строки. argc - количество параметров,argv - строки,представляющие отдельные значения. Смотри об этом подробнее в учебниках.В Visual Studio 2003,2005 используется int _tmain,в 6-й была просто main.
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
там где F то значит что они "мертвые".
а там где T то значит что они "живые".
а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями . и функция по удалению, которая по сути статусы меняет на F
кстати а как вам такой вариант:
что на самом деле с файла ничего удалятся не будет
а только будут высавлястся статусы.
там где F то значит что они "мертвые".
а там где T то значит что они "живые".
а в самой проге будет функция которая проверяет статусы и работает только с "живыми" пользователями . и функция по удалению, которая по сути статусы меняет на F
как такая идея, что скажите ?
main()
ofstream out("dogs.dat",ios::app);
char *name = new char[15];
char status;
в этом примере ты записываешь имя и статус, и читаешь имя и статус в отдельные переменные, и потом в цикле можешь сравнивать статус и вызывать функцию обработку с собаками
Можно функции read и write использовать, они записывают в файл структуры в текстовом виде, и соответственно могут удалять структуры
Помогите написать похожую прогу плз.
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.
Помогите написать похожую прогу плз.
Программа должна удалять запись по совподению строк, но тока в файле в котором нужно удалить данные не один столбец, а 5.
Программа которая приведена в этой теме работает только если в файле один столбец.
Построчно считываем файл в вектор.Вводим слово.которое хотим удалить,удаляем его и перезаписываем файл.Например так.
Читайте также: