C++ C++;从二进制文件读取后,program.exe已停止工作
我用另一种方法将信息存储在一个名为data.txt的二进制文件中,我做了一次课堂飞行。保存记录很好,但现在我在读取我保存的记录时遇到了问题。在文件(eof)结束之前,显示所有记录是可行的。但当记录显示完毕后,会出现一个弹出错误,表明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
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
对象的转储。它是一个管理资源(内存)的类,而仅仅编写对象本身并不能