А как правильно удалить строку из файла? Не соображу. Помогите плиз
Перезаписать с 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();
}
Ну вот записал в файл, сдвинул элементы и все равно ничего изменилось.
не объявлено в этом коде нигде
Сделайте функцию 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)
А почему бы просто не передавать параметром?)
Глобальные переменные лучше не делать без необходимости.
Я совсем уже запутался. Преподаватель мне сказал, что массив должен быть динамический. Ничего не выходит.
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.
Так что именно происходит?)
Это просто вывод значений массива.