Как удалить строку из файла?

А как правильно удалить строку из файла? Не соображу. Помогите плиз

Перезаписать с 0 новым содержимым.

Наверно открыть с ios::trunc.

Все равно, не понимаю ничего

Так а чего непонятного? Просто создайте новый файл с новым содержимым без удаленной строки.

Строку (не в конце) нельзя удалить иначе, максимум перезаписать какие-то байты другими в том же месте или удалить/перезаписать всё начиная с этой строки.

У меня все удаляется а не то, что нужно

Так после того как всё удалилось, запишите то, что там должно быть сейчас )

void Delete(const char* filename, Phone* Myphone, int size)
{
	string name;
	string phone_number;
	string email;
	ofstream fout(filename, ofstream::trunc);
	
	for (int i = 0; i < size; i++)
	{
		if (i == index)
		{
			Myphone[i].FIO = "";
			Myphone[i].number = "";
			Myphone[i].email = "";
		}
		else
		{
			name = Myphone[i].FIO;
			phone_number = Myphone[i].number;
			email = Myphone[i].email;
		}
	}
	fout.close();
}

Я ничего не понимаю уже

Тут нет записи в файл.

И для удаления из массива надо сдвинуть все элементы на 1, иначе ж size нельзя уменьшить.

void Delete(const char* filename, Phone* Myphone, int size)
{
	string name;
	string phone_number;
	string email;
	string res;
	ofstream fout(filename, ofstream::trunc);
	
	for (int i = 1; i < size; i++)
	{
		if (i == index)
		{
			Myphone[i].FIO = "";
			Myphone[i].number = "";
			Myphone[i].email = "";
		}
		else
		{
			name = Myphone[i].FIO;
			phone_number = Myphone[i].number;
			email = Myphone[i].email;
			res = name + " " + phone_number + " " + email;
			fout << res << "\n";
		}
	}
	fout.close();
}

Ну вот записал в файл, сдвинул элементы и все равно ничего изменилось.

не объявлено в этом коде нигде :thinking:


Сделайте функцию Rewrite, которая просто принимает массив и size, и перезаписывает им файл без всяких if.
Сдвиньте элементы массива, уменьшите size и передайте в Rewrite.

Я индекс возвращаю из функции поиска.

index = Find(Myphone, count);
			Delete("Phone_book.txt", Myphone, count);

И объявляю его в начале

если Index локальная переменная, то она невидима внутри Delete

index = Find(Myphone, count);
			Delete("Phone_book.txt", Myphone, count,index );


void Delete(const char* filename, Phone* Myphone, int size, int index)

А почему бы просто не передавать параметром?)
Глобальные переменные лучше не делать без необходимости.

Я совсем уже запутался. Преподаватель мне сказал, что массив должен быть динамический. Ничего не выходит.

:arrow_up:


void Delete(const char* filename, Phone* Myphone, int size, int index)
{
	string name;
	string phone_number;
	string email;
	string res;
	ofstream fout(filename, ofstream::trunc);
	
	for (int i = index - 1; i < size - 1; i++)
	{

		Myphone[i].FIO = Myphone[i+1].FIO;
		Myphone[i].number = Myphone[i+1].number;
		Myphone[i].email = Myphone[i+1].email;
	}
	for (int i = 0; i < size - 1; i++)
	{
		res = Myphone[i].FIO + " " + Myphone[i].number + " " + Myphone[i].email;
		fout << res;
	}
	
	fout.close();
}

Вот что-то сделал, но опять не то что-то. Уже крыша едет))

Ну переменные string name; string phone_number; string email; не нужны, просто не удалил

https://www.programmingsimplified.com/c/source-code/c-program-delete-element-from-array
Я так понимаю это Си? Не совсем понимаю синтаксис printf("%d\n", array[c]);

-1 тут это если считать с 1, а не 0.

Так что именно происходит?)

Это просто вывод значений массива.