Перейти к содержимому

Как удалить элемент из файла c

  • автор:

Developing.ru

Подскажите плиз как я могу удалить строку из файла. Рыл справочники и ниче не нашел. Причем желательно курсор оставить в начале строки, для дальнейшей записи (на место удаленной строки) новой строки.

Kolinus Сообщения: 449 Зарегистрирован: 23 авг 2004, 14:02 Откуда: Минск

Читаешь файл в память.
удаляешь нужную строку.
пишешь файл на диск.

Одной командой на сколько я в курсе такое сделать нереально

В SAD — все в SAD.
SergeyM Сообщения: 18 Зарегистрирован: 14 янв 2005, 08:44

Это все конечно так, но как удалить строку?
Функции я ненашел, как заполнить строку пустыми символами я незнаю. Пробовал как в Делфи использовать » си ругается.
Народ, литературы у меня не так много, в Делфе я бы это решил за несколько минут, но Си п п не Делфи, а нужно в С++.
Помогите плиз, заранее благодарен.

Kolinus Сообщения: 449 Зарегистрирован: 23 авг 2004, 14:02 Откуда: Минск

MAXLENGTH — максимально возможная длина — определишь сам
char buf[MAXLENGTH];
FILE *ff=fopen(«filename»,»r»);
std::list lst;

if(ff!=NULL) while(!feof(ff)) fgets(buf,MAXLENGTH,ff);
//можно здесь смотреть и не добавлять то что надо.
lst.push_back(buf);
>
fclose(ff);
std::list::iterator it;
char *tb;
for(it=lst.begin();it!=lst.end();it++) tb=(char*)(*it);
if(strcmp(tb,str_to_delete)==0)
lst.erase(it);
>
>

Вроде так — сам на си давно не писал, могут сразу возникнуть ошибки.
Проверить щас тоже не на чем

В SAD — все в SAD.
SergeyM Сообщения: 18 Зарегистрирован: 14 янв 2005, 08:44

А как нибудь проще с использованием или с коментариями, чтобы я хоть знал где что и где рыть глубже для большего понимания.
А то я ниче ненашел к примеру про std::list lst. Я так понял что это гдето stream, где-то в этих библиотеках.

Hup Сообщения: 207 Зарегистрирован: 05 мар 2004, 05:31 Откуда: Владивосток Контактная информация:
Я на C# подобное делал.
Если нужно, то могу поискать примерчик по подобной тематике =)
Усложнять — легко, упрощать — сложно
WinMain Сообщения: 913 Зарегистрирован: 14 янв 2005, 10:30 Откуда: Москва Контактная информация:

В качестве динамического контейнера для строк нужно использовать не std::list, а std::list или std::vector.
Кроме них существуют и другие готовые контейнеры для строк, которые реализованы в тех или иных библиотеках. Ты к сожалению не указал в какой среде программирования собираешься это сделать.
Если в C++ Builder, то там есть класс TStringList, в котором есть готовый метод LoadFromFile(). В MFC для VC++ есть классы CStringArray и CStringList.
Читать текст построчно из файла можно функцией fgets() или методом ifstream::getline(). Или используй аналогичные классы из соответствующих библиотек своей среды разработки, типа CFile и CArchive из MFC.

Kolinus Сообщения: 449 Зарегистрирован: 23 авг 2004, 14:02 Откуда: Минск

Если в C++ Builder, то там есть класс TStringList, в котором есть готовый метод LoadFromFile(). В MFC для VC++ есть классы CStringArray и CStringList.

именно потому я и постарался выразиться средствами STL

SergeyM либо укажи платформу либо поищи документацию по STL

Как удалить элемент из файла c

Функция поиска по фамилии:

void SearchInDB() < FILE *f = fopen("db.txt", "rb"); FILE *num = fopen("num.txt", "rb"); if (f == NULL || num == NULL) < system("cls"); printf("\nНе удалось открыть файл базы данных"); printf("\nНажмите любую клавишу для выхода в меню"); getch(); >else < struct record recz[100]; int i, kol; fread((int*)&kol, 1, sizeof(kol), num); //заполнение массива записями из файла for (i = 0; i < kol; i++) < fseek(f, sizeof(recz[i])*i, 0); fread((char*)&recz[i], 1, sizeof(recz[i]), f); >int z, s = 0; char surn[12]; cin >> surn; system("cls"); printf("Поиск абонентов с фамилией %s", surn); for (z = 0; z < kol; z++) < if (strcmp(surn, recz[z].surn) == 0) < printf("\n\nЗапись №%i", recz[z].num); printf("\nФИО ->%s %s %s", recz[z].surn, recz[z].name, recz[z].patronymic); printf("\nНомер телефона -> %i", recz[z].tel); s++; > > if (s == 0) < printf("\n\nНе найдено абонентов с фамилией %s ", surn); >if (s == 1) < printf("\n\nБольше абонентов не найдено"); >> fclose(f); fclose(num); >

И аналогичные функции добавления абонента, создание базы данных и её просмотра (при необходимости выложу). Но никак не могу разобраться с функцией удаления абонента из базы данных (любым способом: по фамилии, по телефону или номеру, неважно).
Подскажите пожалуйста, как её реализовать?

Вот мой набросок:

void DelFromDB() < FILE *f = fopen("db.txt", "ab"); FILE *num = fopen("num.txt", "r+b"); if (f == NULL || num == NULL) < system("cls"); printf("\nНе удалось открыть файл базы данных"); printf("\nНажмите любую клавишу для выхода в меню"); getch(); >else < struct record recz[100]; int i, kol, c = 0, s = 0; fread((int*)&kol, 1, sizeof(kol), num); for (i = 0; i < kol; i++) < fseek(f, sizeof(recz[i])*i, 0); fread((char*)&recz[i], 1, sizeof(recz[i]), f); >printf("\nВведите № записи абонента, которого нужно удалить\n"); int number = getch(); for (int z = 0; z < kol; z++) < if (recz[z].num == number) < // и дальше тупик. >> fclose(f); fclose(num); > >

Заранее спасибо за любую помощь!

Последний раз редактировалось Alena_Sw; 02.12.2016 в 21:11 .

Удалить элементы из файла

Author24 — интернет-сервис помощи студентам

Известно количество элементов, n = 10. Мне нужно из файла удалить первую половину чисел, каким именно способом это лучше сделать?
п.с. не прошу написать за меня код, с этим я справлюсь, подскажите КАК ИМЕННО это сделать.
Может как-то заменять нужно эти числа на пустой символ, или как-то можно удалять значения из файла?

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Удалить из файла отрицательные элементы
Дан файл целых чисел.Удалить из него отрицательные элементы собственно делаю 2мя.

Удалить из файла все элементы, расположенные на позициях с четными номерами
Дан файл целых чисел. Удалить из него все элементы, расположенные на позициях с четными номерами.

Удалить четные элементы из файла
Дан файл целых чисел удалить из него все элементы с четными номерами var,Ft:file of integer; i.

2432 / 1041 / 475
Регистрация: 17.11.2018
Сообщений: 2,721
Sailana, именно эта строка или числа в строке могут быть другие?
Регистрация: 24.10.2020
Сообщений: 18
Числа могут быть разные
2432 / 1041 / 475
Регистрация: 17.11.2018
Сообщений: 2,721

ЦитатаСообщение от Sailana Посмотреть сообщение

каким именно способом это лучше сделать

Sailana, так ты сделай любым, которым можешь. Не важен способ — важен результат.
Например, можешь получить строку символов, найти в ней пятый пробел ( n / 2 = 5 ). И перезаписать строку по новой, начиная с символа после пробела, т.е. в твоём примере, с цифры ‘6’.

Регистрация: 24.10.2020
Сообщений: 18

Спасибо! Тогда так сейчас и попробую сделать, мало-ли, думала может есть какой-либо способ более корректный. Я ещё только учусь

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Удалить из файла четные элементы
Кратко: Вводим числа в файл, нужно удалить четные, как это реализовать? Program Variant_4; .

Удалить из файла простые элементы
простите но мне нужна помащ можете помоч решить задачу на visual basic 6.0 ? удалить из файла.

Удалить из файла чётные элементы
Создать типизированный файл целых чисел. Записать в него с консоли последовательность целых чисел.

Удалить элементы из типизированного файла
Составить программы, с помощью которых: — сформировать файл из целых чисел, которые должны быть.

Нужно из файла удалить все отрицательные элементы
нужно из файла удалить все отрицательные элементы затрудняюсь именно с этим. точнее читал что.

Удалить из файла все элементы с четными номерами
Составление программы с текстовыми и типизированными файлами. 14.2 Написать программу, заносящую в.

Или воспользуйтесь поиском по форуму:

Удаление строки из файла С++

Можно, но сложнее в реализации — можно допустить ошибку. Копируете остаток файла после удаляемой строки в буфер в памяти. Потом записываете его с адреса начала удаляемой строки. В конце вычисляете новый размер файла и «обрезаете» его с помощью std::filesystem::resize_file .
Если памяти мало (остаток не помещается в память), то ограничиваете размер буфера (например 1 Mb) и повторяете в цикле так пока не перепишете весь остаток файла.

Отслеживать
ответ дан 31 мая 2022 в 10:56
4,566 1 1 золотой знак 5 5 серебряных знаков 19 19 бронзовых знаков

Посмотрите на man fseek (а также ftell там же) и вперед.

Например, вот так

#include #include #include #include // first argument -- `file-name`, second -- line number for delete (counts from zero) int main (int ac, char *av[]) < if (ac != 3) < fprintf(stderr, "Usage: %s file-name line-number\n", av[0]); exit(1); >size_t lineno = atoi(av[2]); FILE *file = fopen(av[1], "r+"); if (!file) < perror(av[1]); exit(1); >struct stat st; fstat(fileno(file), &st); char *line; ssize_t ll; size_t n = 0, lsz = 0; long pos = -1; while ((ll = getline(&line, &lsz, file)) > 0) < if (n == lineno) < pos = ftell(file); break; >n++; > if (pos == -1) < fprintf(stderr, "line %zd not found (%zd lines in the file)\n", lineno, n); exit(2); >free(line); long wpos = pos - ll; // printf("line %zd found at pos %zd (end at pos %zd)\n", // lineno, wpos, pos); size_t bsize = 1024 * 128; char *buf = (char *)malloc(bsize); size_t lr; while ((lr = fread(buf, 1, bsize, file))) < pos = ftell(file); fseek(file, wpos, SEEK_SET); fwrite(buf, 1, lr, file); wpos = ftell(file); fseek(file, pos, SEEK_SET); >ftruncate(fileno(file), st.st_size - ll); return puts("End") == EOF; > 

Ага, g++ компайлер признает этот код вполне крестовым (т.е. с++-шным)

Конечно, переписывание данных внутри файла подобным образом не самый быстрый вариант (перемещение по файлу будет сбивать алгоритм опережающего чтения файла ядром ОС в кэш файловой системы, imho переписать в другой файл и переименовать его будет работать быстрее).

Самым же оптимальным, видимо, должен быть вариант с использованием mmap (в результате этого вызова часть адресного пространства пользователя будет отображаться на адреса в файловом кэше ядра, содержащие файл).

Затем несколькими memchr() в цикле фиксируется нужная строка и вызывается memmove() для сдвига данных файла прямо в памяти ядра. В конце (как и в приведенном коде) вызов truncate() обрезает файл до нужного размера.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *