【发布时间】:2016-05-18 20:05:58
【问题描述】:
我有一个“书”结构,其中包含可用书籍的作者、名称和数量。
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 文件,然后在其中添加“书籍”。
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。
我在这里做错了什么?
【问题讨论】:
-
您确实应该检查来自这些 API 调用的所有的返回值,以确保一切正常。
-
除了进行错误检查的 scanf 错误之外,还使用早已过时的 TCHAR,使用原始 Win32 IO 而不是 C++ IO 并编写未初始化的结构。
-
我应该尽可能使用原始 Win32 方法。如果我有选择,我不会使用这些。将添加错误检查。