【问题标题】:Error in File handling C++文件处理 C++ 中的错误
【发布时间】:2013-03-17 11:17:12
【问题描述】:

代码是这样的

ofstream f("bank.dat", ios::app);
ifstream fa("bank.dat");
int n = 0, flag = 0;
struct bac
{
    char name[10];
    char amt[5];
} s;

void add()
{ 
    cout << "\nenter the details ";
    cin >> s.name >> s.amt;
    f.write((char *)&s, sizeof(bac));

}

void ser()
{
    ifstream fa("bank.dat");
    fa.seekg(0);
    char x[10];
    cout << "\nenter value to be searched ";
    cin >> x;

    while (fa && flag == 0)
    {
        n++;
        fa.read((char *)&s, sizeof(bac));
        if (strcmp(s.name, x) == 0)
        {
            flag = 1;
            break;
        }
    }
    if (flag == 1)
    {
        cout << "\nfound";
        cout << "\nAmount " << s.amt;
    }


}

void mod()
{
    ser();
    cout<<" "<<n;
    if (flag == 1)
    {
        f.seekp((n - 1) * sizeof(bac));
    //  cout<<f.tellp();
        cout<<"\nnew details ";
        add();
    }
}


int main()
{f.seekp(0);
    int ch;

        cout << "\nBANK MANAGEMENT SYSTEM \n";
        cout << "enter choice ";
        cout << "\n1.add\n2.search\n3.delete and overwrite ";
        cin >> ch;
        if (ch == 1)
        {
            add();
        }
        if (ch == 2)
        {
            ser();
        }
        if (ch == 3)
        {
            mod();
        }

    return 0;
}

我想做的是做一个具有搜索、显示和修改功能的程序;

错误

记录最后被附加,即使我使用

f.seekp((n - 1) * sizeof(bac));

执行的操作

*add sid , sar 分别以 amts 5,6 命名条目

*将 sid 命名条目替换为 name : sid (same as original ) amt :7

文件中的输出

预期 sid 7 sar 6

找到 sid 5 sar 6 sid 7

【问题讨论】:

    标签: c++ file file-handling


    【解决方案1】:

    我认为这是因为您使用的是 ios::app 标志。

    正如它所写的here

    app:    (append) Set the stream's position indicator to the end of the stream before each output operation.
    

    【讨论】:

    • 嗯嗯,你是对的......但是将其更改为 ios::ate 或将其留空,并不能解决问题!
    • 我认为您必须将其留空,并将写入光标放在您的 add 方法中的流末尾
    • 还有一件事@Kevin 每当我尝试运行一个while循环以使程序在菜单上运行时,总是会出现错误,例如没有写入文件!
    • 哦!我终于让它工作了!!!我用吃了..做了一些修改,效果很好,谢谢!
    【解决方案2】:

    在 ser() 操作开始时重新初始化“n = 0”。目前,每次调用搜索时您都会不断增加“n”,这就是记录被附加到文件末尾的原因。我建议不要使用全局变量“n”和“标志”,而是返回这些值,例如

    int ser()
    {
        // return n if search succeeds else return '-1'.
    }
    

    我看到它可以通过各种方式进行改进,也许可以看看标准书中关于 IO 的示例代码。

    【讨论】:

    • 谢谢你的建议,我会调查的!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-17
    • 2018-05-20
    • 2017-10-26
    • 2022-01-05
    • 2014-05-26
    • 2010-11-12
    • 2017-11-19
    相关资源
    最近更新 更多