0

我正在写入、读取和删除文件的内容。除了删除部分之外,一切都很好,因为当我按下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);
}
4

2 回答 2

1

编辑:再次查看您的代码,我发现问题是您正在使用 ios::app 尽管您也通过了 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 个字符长。

于 2013-08-17T12:54:08.330 回答
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();
    }
}
于 2013-08-17T13:06:03.857 回答