Удаление содержимого файла не работает

Я пишу, читаю и удаляю содержимое файла. Все работает нормально, кроме части удаления, как при нажатии y он говорит, что удален, но не отображает никаких записей.

typedef struct ch
{
char str[10];
};

void disp(ch d)
{
cout<<"\n"<<d.str<<"\n";
}
//delete part
cout<<"\nwant to delete??";
char c;
cin>>c;
if(c=='y')
{
char s[10];
cout<<"nter - ";
cin>>s;
file.seekg(0);
int found=0;
fstream temp("temp.dat",ios::in|ios::out|ios::app);
while(file.read((char *)&dta,sizeof(dta)))
{
if(strcmp(dta.str,s)==0)
{
found=1;
cout<<"deleted";
}
else
temp.write((char *)&dta,sizeof(dta));
}
if(!found)
cout<<"not found";
remove("new.dat");
rename("temp.dat","new.dat");
temp.close();
file.open("new.dat",ios::in|ios::out|ios::app);
}

0

Решение

РЕДАКТИРОВАТЬ: Просматривая ваш код еще раз, я вижу проблему в том, что вы используете приложение ios ::, хотя вы также передали ios :: in.

ios :: app — все операции вывода выполняются в конце файла, добавляя
содержимое текущего содержимого файла. Этот флаг может быть только
используется в потоках, открытых для операций только для вывода.

http://www.cplusplus.com/doc/tutorial/files/

Старый пост:

Взгляните на следующий пример кода:

#include <iostream>
#include <fstream>
#include <cstdio>
#include <cstring>

using namespace std;

const char g_szTestData[] = "This is some test da$$$$######ta and some more"" tes$$$$######ting";

int main(int argc, char** argv)
{
fstream file("new.dat", ios::in|ios::out);
file << g_szTestData << flush;

cout << "Do you want to delete all $$$$######?";
if (cin.get() == 'y')
{
char szBuffer[10];                  //< File read buffer
char szString[11] = "$$$$######";   //< 10 characters + '\0'
bool bFound = false;

fstream temp("temp.dat", ios::out);
file.seekg(0, file.beg);

while (file.read(szBuffer, sizeof(szBuffer)))
{
if (strncmp(szBuffer,szString,10) == 0) bFound = true;
else temp.write(szBuffer, sizeof(szBuffer));
}

temp.flush();
temp.close();

if (bFound)
{
file.close();
remove("new.dat");
rename("temp.dat", "new.dat");
file.open("new.dat",ios::in|ios::out);
}
else cout << "Pattern Not Found!" << endl;
}

/* Do something with the contents of file. */

// Lets clean up at the end
file.close();

return 0;
}

В этом примере создается файл и содержимое g_szTestData добавлены, вы можете проверить это, открыв файл (перед нажатием ‘y’).

Затем пользователя спрашивают, хотят ли они удалить строку из 10 символов. $$$$###### из файла. Если пользователь желает продолжить, новый файл открывается temp.dat, Программа постепенно проходит через существующие new.dat файл (10 символов одновременно). Если строка, из которой программа читает new.dat не является целевой строкой, строка записывается во временный файл.

Если целевая строка найдена, оба файла закрываются, старый файл удаляется, а новый файл переименовывается в имя старого файла. Затем открывается новый файл, чтобы программа могла выполнять дополнительную работу с его содержимым.

Вместо фиксированной строки из 10 символов можно попросить пользователя указать строку, которую он хочет удалить, используя cin >> szString но строка должна быть длиной 10 символов.

1

Другие решения

Ваш код работает как положено, он только отображает deleted так как disp() не называется нигде

#include <iostream>
#include <string.h>
#include <fstream>

#include <stdio.h>

using namespace std;

typedef struct {
char str[16];
} ch;

static void disp(ch d) {
cout<<d.str<<"\n";
}

int main(int argc, char **argv) {
fstream file;
ch dta;

file.open("new.dat",ios::in|ios::out|ios::trunc);
for (int i=0; i<3; i++) {
snprintf((char *)&dta.str, sizeof(dta.str)-1, "rec%d", i);
file.write((char *)&dta,sizeof(dta));
}

//delete part
{
char s[16] = "rec1";
file.seekg(0);
int found=0;
fstream temp("temp.dat",ios::out);
while(file.read((char *)&dta,sizeof(dta))) {
if(strcmp(dta.str, s)==0) {
found=1;
cout<<"deleted * ";
disp(dta);
} else {
temp.write((char *)&dta,sizeof(dta));
disp(dta);
}
}
if(!found)
cout<<"not found";
file.close();
remove("new.dat");
rename("temp.dat","new.dat");
temp.close();
}
}
1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector