文件处理错误(未处理异常)

C++ File handling error(unhandled exception)

本文关键字:异常 未处理 处理 错误 文件      更新时间:2023-10-16

我想写一个程序,你注册一个银行账户,并修改它。这是代码(不完整,但只是试图尝试与文件处理;我是一个编程初学者)

    #include <iostream>
    #include <fstream>
    #include <string>

     std::ofstream outfile;
    std::ifstream infile;
    std::fstream inout;
struct bank{
    int acc_nr;
    std::string emri;
    std::string mbiemri;
};

std::istream& operator>> (std::ifstream& in, bank& klient)
{
    in >> klient.emri;
    in >> klient.mbiemri;
    in >> klient.acc_nr;
    return in;
}
std::ostream& operator<< (std::ofstream& out, bank& klient)
{
    out << klient.emri << std::endl;;
    out << klient.mbiemri << std::endl;
    out << klient.acc_nr << std::endl;
    return out;
}
std::ostream& operator<< (std::fstream& out, bank& klient)
{
    out << klient.emri << std::endl;;
    out << klient.mbiemri << std::endl;
    out << klient.acc_nr<< std::endl;
    return out;
}
std::istream& operator>> (std::fstream& in, bank& klient)
{
    in >> klient.emri;
    in >> klient.mbiemri;
    in >> klient.acc_nr;
    return in;
}
std::istream &read(bank &klient, std::istream &is)
{
    std::cout << "Jepni emrin: ";
    is >> klient.emri;
    std::cout << "Jepni mbiemrin: ";
    is >> klient.mbiemri;
    std::cout << "Jep numrin e akaundit: ";
    is >> klient.acc_nr;
    return is;
}
const std::ostream &print(bank klient, std::ostream &os) 
{
    std::cout << "Emri: ";
    os << klient.emri;
    std::cout << "nMbiemri: ";
    os << klient.mbiemri;
    std::cout << "nNumri i akaundit: ";
    os << klient.acc_nr;
    return os;
}
void read_infile(bank &klient)
{
    read(klient, std::cin);
    outfile.open("C:\publik\sample.dat", std::ios::app| std::ios::binary);
    outfile.write(reinterpret_cast <char *>(&klient), sizeof(bank));
    outfile.close();
}
void print_outfile(bank klient)
{
    infile.open("C:\publik\sample.dat", std::ios::in| std::ios::binary);
    infile.read(reinterpret_cast <char *>(&klient), sizeof(bank));
    infile.close();
}
void kerko(std::string emri, std::streampos& a)
{
    bank temp;
    inout.open("C:\publik\sample.dat", std::ios::in | std::ios::out | std::ios::binary);
    while (inout.read(reinterpret_cast <char *>(&temp), sizeof(bank)))
    {
        if (emri == temp.emri)  // emri = name.
        {
            print(temp, std::cout);
            a = inout.tellg();
            inout.close();
        break;
        }
    }
}

int main()
{
    bank klient;
    bank temp2;
    std::string emri;
    std::streampos a;
    std::cin >> emri;
    bank temp;
    kerko(emri,a);
    std::cout <<std::endl;
    system("pause");
    return 0;
}

代码读取一个名称,搜索文件,然后显示其信息。搜索和显示是成功的,但我得到这个错误

bank .exe中0x77CFDF58 (msvcp120 .dll)的未处理异常:0xC0000005:访问冲突读取位置0x00DCAB9C.

代码不会在while循环中调用print函数后执行。

感谢您的宝贵时间。

这里有几个地方是错误的。

首先你不能这样做:

read(klient, std::cin);
outfile.open("C:\publik\sample.dat", std::ios::app| std::ios::binary);
outfile.write(reinterpret_cast <char *>(&klient), sizeof(bank));

您的客户端是一个复杂的结构,使用的类型(std::string),您对其内部布局一无所知。它可能有指向它外面的指针。要读取一个记录,你应该这样做;

bank klient ;
std::ifstream istream("name", std::ios::app| std::ios::binary); // or use open
istream >> klient ;

现在我们到了第二点。这个定义很好(我应该用std::ostream而不是std::ofstream,但这是一个小问题)

std::ostream& operator<< (std::ofstream& out, bank& klient)
{
    out << klient.emri << std::endl;;
    out << klient.mbiemri << std::endl;
    out << klient.acc_nr << std::endl;
    return out;
}

重点是,当你想读emri或mbiemri时,你怎么知道第一个结束,第二个开始?最简单的方法是插入一个空格。只有当emri/mbiemri本身不包含空格时,它才有效,但对于初学者来说,这可能是一个很好的起点。

现在就到这里,你有足够的时间考虑…