- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我是您论坛的新手,所以请原谅任何失误。我正在研究一个读取和写入二进制文件的 C++ 项目。我首先尝试在 c++ 上使用 full 来执行此操作,但是当出现错误时,我的导师告诉我使用 c 风格的文件操作。低看,我得到了同样的错误:
CSI_FinalProj_EmployeeDB.exe 中 0x6087CCC8 (msvcp110d.dll) 处未处理的异常:0xC0000005:访问冲突读取位置 0x00CDDAEC。
这发生在成功完成读取和打印,并成功关闭文件之后。它总是在程序退出函数并试图返回调用函数时发生。如果我把它放在 main 中,它会在返回后爆炸,当程序结束时。
该函数是一个简单的打印函数:
void fileClerkType::printRecord(int id)const
{
FILE* spRead;
employeeType record;
long location;
long size;
location = id - 1;
size = sizeof(employeeType);
spRead = fopen("companyFile.dat", "r");
fseek(spRead, location*size, SEEK_SET);
fread(&record, sizeof(employeeType), 1, spRead);
// If a record has been deleted, the id will be 0
// In that case, don't print
if (record.getEmployeeID() != 0)
{
cout << record << endl;
fread(&record, sizeof(employeeType), 1, spRead);
}
fclose(spRead);
}//Unhandled exception at 0x5065CCC8 (msvcp110d.dll) in
//CSI_FinalProj_EmployeeDB.exe: 0xC0000005: Access violation
//reading location 0x00CDDAEC.
正如我所说,该功能运行良好。 employeeType 是一个类,它具有:
2 个整数、三个字符串和一个 float
这是具有相同问题的原始 c++ 版本。唯一的区别是这会打印所有记录。它也很完美。:
void administratorType::showAllRecords()
{
long test;
long position = 0;
long recordSize = sizeof(employeeType);
ifstream inFile("EmployeesNew.dat", ios::in | ios::binary);
employeeType buffer; // empty employeeType
if(inFile.is_open())
{
inFile.seekg((position * recordSize), ios::beg);
test = inFile.peek(); // Debug
inFile.read(reinterpret_cast<char*>(&buffer), recordSize);
position = 0;
while(position < getRecordCount())
{
inFile.seekg((position * recordSize), ios::beg);
test = inFile.peek();
inFile.read(reinterpret_cast<char*>(&buffer), recordSize);
outputRecord(cout, buffer);
position++;
}
inFile.close();
}
}// Runs fine to here, but throws error when leaving the function
// Unhandled exception at 0x5408CCC8 (msvcp110d.dll) in
// ProjectName.exe: 0xC0000005: Access violation
// reading location 0x0137D3B4.
这一定是一个实现问题。但我看不到它。实现中是否有什么东西导致跟踪函数调用和返回的指针被破坏?预先感谢您的帮助。
抱歉,这是Employee 类的成员变量列表。它们不是固定长度的字符串:
int age;
int employeeID; // Auto-generated
float salary;
string lastName;
string firstName;
string ssn;
最佳答案
std::string
不是 trivially copyable类型,因此没有一个类作为成员是可简单复制的。
您不能像这样按字节读取或写入非平凡可复制类型。由于大多数库都采用了 SSO,因此当您从字符串中读取时,该函数可能不会崩溃。 (假设 lastName
、firstName
和 ssn
足够短),但您在销毁过程中仍然会遇到问题。
在 C++ 中序列化数据的规范方法是重载流运算符,这是一个示例:
std::istream& operator>>(std::istream& stream, employeeType& employee)
{
return stream >>
employee.age >>
employee.employeeID >>
employee.salary >>
employee.lastName >>
employee.firstName >>
employee.ssn;
}
std::ostream& operator<<(std::ostream& stream, employeeType const& employee)
{
return stream <<
employee.age << ' ' <<
employee.employeeID << ' ' <<
employee.salary << ' ' <<
employee.lastName << ' ' <<
employee.firstName << ' ' <<
employee.ssn << '\n';
}
可以在循环中读取或写入记录,例如
for (employeeType e; inFile >> e;)
//do something with e
或者你甚至可以将它们复制到一个 vector 中
std::vector<employeeType> employees(
std::istream_iterator<employeeType>(inFile),
std::istream_iterator<employeeType>()
);
关于c++ - 从二进制文件读取后出现未处理的异常,当控制权返回给调用函数时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817225/
所以我使用 PyGame 制作了 Pong,我想使用遗传算法让 AI 学习玩这个游戏。我希望它只知道其桨、球和控件的位置。我只是不知道如何让人工智能自己移动桨。我不想这样做:“如果球在你上方,就向上。
我有包含 4 个子选项卡的 TabControl。 每个选项卡都包含图片框控件。 我需要获取选中的Tab控件的图片框控件。 知道如何实现吗? 最佳答案 也许 var picBox = TabContr
我需要使用 Java 代码控制 Windows XP 的 Windows,我需要单击/键入 windowsXP 给定窗口的特定按钮/文本字段,如何做到这一点有什么想法吗? 我尝试过的方法是:(1) 我
我是一名优秀的程序员,十分优秀!