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

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

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

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.

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

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

Ну вроде разобрался с этим. Но у меня есть функция сортировки, там тоже нужно перезаписать в файл, а то удаляется не та строка. То есть, если добавить элементы и потом сразу вызвать функцию удаления, то все ок. А если отсортировать, то удаляется не та строка)))

Только подскажите пожалуйста что использовать при сортировке? ios::trunc и ios::app, наверно не подойдут? А вообще, спасибо огромное, очень помогли. Занимаемся один раз в неделю, в плюсы не самый легкий язык, приходится многое изучать самостоятельно. Поэтому все непросто)

И еще один вопрос, почему когда запускаю программу и выполняю функцию Show, у меня появляется еще одна неполная строка, только с именем?

поэтому надо сделать

и вызывать её, где надо.

Если проблемы при сортировке или других задачах как-то связаны с наличием вызова этого удаления, то видимо “глобальный” size не обновлен.
:arrow_down: