Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;从二进制文件读取后,program.exe已停止工作_C++ - Fatal编程技术网

C++ C++;从二进制文件读取后,program.exe已停止工作

C++ C++;从二进制文件读取后,program.exe已停止工作,c++,C++,我用另一种方法将信息存储在一个名为data.txt的二进制文件中,我做了一次课堂飞行。保存记录很好,但现在我在读取我保存的记录时遇到了问题。在文件(eof)结束之前,显示所有记录是可行的。但当记录显示完毕后,会出现一个弹出错误,表明Program.exe已停止工作 void Flight::ViewFlight(){ HANDLE hConsole; //Console colors hConsole = GetStdHandle(STD_OUTPUT_HANDLE); fstre

我用另一种方法将信息存储在一个名为data.txt的二进制文件中,我做了一次课堂飞行。保存记录很好,但现在我在读取我保存的记录时遇到了问题。在文件(eof)结束之前,显示所有记录是可行的。但当记录显示完毕后,会出现一个弹出错误,表明Program.exe已停止工作

void Flight::ViewFlight(){
HANDLE hConsole;        //Console colors
hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
fstream data;
Flight flight;
data.open("data.txt",ios::in | ios::binary);
if (data.fail())
{
    SetConsoleTextAttribute(hConsole, 12);
    cout<<"\n\nFlight data does not exist yet";
    cout<<"\n\nYou are being redirected to the Main Menu in 3 seconds\n\n";
    cout<<"3\n\n";
    Sleep(1000);
    cout<<"2\n\n";
    Sleep(1000);
    cout<<"1\n\n";
    Sleep(1000);
    cout<<"0\n\n";
    SetConsoleTextAttribute(hConsole, 15);
}
else{
    while(data.read((char*) &flight, sizeof(flight)))
    {   
        if(!data.eof())
        {
            SetConsoleTextAttribute(hConsole, 10);
            cout<<"\n\n----------- Record for "<<flight.flightid<<" -----------\n";
            SetConsoleTextAttribute(hConsole, 15);
            cout<<"\nFlight Number \t\t: "<<flight.flightnumber;
            cout<<"\nDeparture Airport\t: "<<flight.departAirport;
            cout<<"\nArrival Airport\t\t: "<<flight.arriveAirport;
            cout<<"\nDeparture Time\t\t: "<<flight.departTime.hour<<":"<<flight.departTime.minute;
            cout<<"\nDeparture Date\t\t: "<<flight.departDate.day<<"/"<<flight.departDate.month<<"/"<<flight.departDate.year;
            cout<<"\nPrice \t\t\t: RM "<<flight.price;
            cout<<"\nBusiness Class Seats\t: "<<flight.bseat;
            cout<<"\nFirst Class Seats\t: "<<flight.fseat;
            cout<<"\nEconomy Class Seats\t: "<<flight.totalseat;
            cout<<endl;
        }
    }
}
data.close();
}
void Flight::ViewFlight(){
句柄hConsole;//控制台颜色
hConsole=GetStdHandle(标准输出句柄);
流数据;
飞行;
data.open(“data.txt”,ios::in | ios::binary);
if(data.fail())
{
SetConsoleTextAttribute(hConsole,12);

cout循环似乎正常,您的文件可能有损坏的数据,可能是未终止的字符串,或者输入文件末尾可能有/有一些垃圾字符。要验证循环中的所有cout语句,并查看程序是否停止挂起。
此外,data.eof()检查是多余的,但是它不应该挂起程序。

循环似乎很正常,您的文件可能有损坏的数据,可能是未终止的字符串,或者输入文件末尾可能有一些垃圾字符。要验证循环中的所有cout语句,并查看程序是否停止挂起。
还有data.eof()check是多余的,但是它不应该挂起程序。

您的
Flight
类包含
std::string
成员。这些不是简单的旧数据类型,通常包含指向动态分配内存的指针。您不能将类作为一个单元读写,而希望
std::string
成员及其内容nts将被正确构造。这可能适用于
时间
数据
成员,但您尚未说明它们是如何定义的

你需要仔细研究一下

几个相关问题:


您的
Flight
类包含
std::string
成员。这些不是简单的旧数据类型,通常包含指向动态分配内存的指针。您不能将类作为一个单元读写,希望
std::string
成员及其内容能够正确构造。这可能适用于类e> 时间
数据
成员,但您尚未显示它们是如何定义的

你需要仔细研究一下

几个相关问题:


刚刚查看了飞行类,您不能直接读入具有其他类对象的类。在您的情况下,是字符串对象。您需要对流进行反序列化并自己初始化变量 问题是,当航班被销毁时,它正在销毁那些不是正确构造的字符串对象的字符串对象。
基本上,首先将字符串从缓冲区中分离出来,然后自己一个一个地分配给字符串变量。

刚刚查看了飞行类,您不能直接读入具有其他类对象的类。在您的情况下,字符串对象。您需要反序列化流并自己初始化变量 问题是,当航班被销毁时,它正在销毁那些不是正确构造的字符串对象的字符串对象。
基本上,首先将字符串从缓冲区中分离出来,然后自己一个一个地分配给字符串变量。

飞行结构由指向动态分配内存(堆)的其他类组成,例如
string flightnumber;
是STL字符串类,其中包含char*或wchar*。 如果将飞行对象另存为二进制缓冲区,它将只保存指针。加载该对象时,指针中会出现内存地址,这是无效的。这就是您出现访问冲突异常的原因,这意味着您试图访问未分配的内存

顺便说一句,这是得到0xC0000005的最佳情况,在最坏的情况下,您只需访问分配给其他对象的内存,并在输出中得到垃圾

您必须为Flight class和每个非标准库的class成员重载operator>。完成后,您只需编写:

fstream data;
Flight flight;
data >> flight;

Flight结构由指向动态分配内存(heap)的其他类组成,例如
字符串flightnumber;
是STL字符串类,其中包含char*或wchar*。 如果将飞行对象另存为二进制缓冲区,它将只保存指针。加载该对象时,指针中会出现内存地址,这是无效的。这就是您出现访问冲突异常的原因,这意味着您试图访问未分配的内存

顺便说一句,这是得到0xC0000005的最佳情况,在最坏的情况下,您只需访问分配给其他对象的内存,并在输出中得到垃圾

您必须为Flight class和每个非标准库的class成员重载operator>。完成后,您只需编写:

fstream data;
Flight flight;
data >> flight;

飞行的定义将是相关的。在调试器中运行程序,查看失败的位置。0x0FABCC8(msvcp110d.dll)处未处理的异常在System.exe中:0xC0000005:访问冲突读取位置0x004C0754。这是在我尝试调试它时弹出的,它是在读取最后一条记录后弹出的。飞行的定义将是相关的。在调试器中运行您的程序,看看它失败的地方。0x0FABCC8(msvcp110d.dll)处未处理的异常在System.exe中:0xC0000005:访问冲突读取位置0x004C0754。这是在我尝试调试它时弹出的,它是在读取最后一条记录后弹出的。尝试对所有cout语句进行注释时,仍然有相同的错误。尝试对所有cout语句进行注释时,仍然有相同的错误。@JamesLeng:底线是您不能进行二进制fil一个
std::string
对象的转储。它是一个管理资源(内存)的类,而仅仅编写对象本身并不能