我有一本"书"包含作者,名称和可用书籍数量的结构。
struct book {
TCHAR author[32];
TCHAR name[32];
SHORT count;
void insert() {
cout << "Book author: "; wscanf_s(L"%s", author, _countof(author));
cout << "Book name: "; wscanf_s(L"%s", name, _countof(name));
cout << "Book count: "; wscanf_s(L"%i", count);
}
void get() {
cout << "Book info: " << endl;
wprintf(L"\nAuthor - %s", author);
wprintf(L"\nName - %s", name);
wprintf(L"\nCount - %i", count);
cout << endl;
}
};
该任务让我制作一个DAT文件,然后添加&#34; books&#34;在里面。
HANDLE hFile = CreateFile(_TEXT("C:\\Students\\book.dat"), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
SetFilePointer(hFile, 0, 0, FILE_END);
book newBook;
DWORD bytesWritten;
newBook.insert();
WriteFile(hFile, &newBook, sizeof(book), &bytesWritten, NULL);
FindClose(hFile);
然而,每当我这样做时,我都会收到错误:
访问冲突写入位置0xFFFFFEFE。
我在这里做错了什么?
答案 0 :(得分:0)
这一行
App.Contact = DS.Model.extend({
name : DS.attr('string'),
// Turn the below on to see your problem. Matt H belongsTo 2 different companies
//company : DS.belongsTo('Company')
});
应该是
company : DS.belongsTo('Company')
您可能还应该检查文件是否已打开:
cout << "Book count: "; wscanf_s(L"%i", count);
---编辑---
使用您的代码,Visual Studio会发出以下警告:
c:\ dev \ test \ test.cpp(14):警告C4477:'wscanf_s':格式字符串'%i'需要类型为'int *'的参数,但可变参数1的类型为'SHORT *'
c:\ dev \ test \ test.cpp(14):注意:考虑在格式字符串中使用'%hi'
这意味着什么
cout << "Book count: "; wscanf_s(L"%i", &count);
应该是
HANDLE hFile = CreateFile(_TEXT("C:\\Students\\book.dat"), GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE) {
cerr << "Unable to open file\n";
exit(1);
}
或者你应该算一个DWORD。
答案 1 :(得分:0)
访问冲突是因为您在使用FindClose
打开的句柄上调用了CreateFile
。 FindClose
仅用于关闭通过FindFirstFile
获得的句柄。
您需要拨打CloseHandle
。