C++ 将结构写入文件时发生访问冲突

C++ 将结构写入文件时发生访问冲突,c++,winapi,C++,Winapi,我有一个包含作者、姓名和可用图书数量的图书结构 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"

我有一个包含作者、姓名和可用图书数量的图书结构

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;
    }
};
但是,每当我这样做时,都会出现一个错误:

访问冲突写入位置0xFFFFFEFE

我做错了什么?

这行

cout << "Book count: ";  wscanf_s(L"%i", count);
应该是

cout << "Book count: ";  wscanf_s(L"%i", &count);
cout << "Book count: ";  wscanf_s(L"%hi", &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);
}
--编辑--

按原样使用代码时,Visual Studio会发出以下警告:

c:\dev\test\test.cpp14:警告C4477:'wscanf_s':格式字符串'%i'需要类型为'int*'的参数,但变量参数1的类型为'SHORT*'

C:\DEV\Test\Test.CPP14:注意:考虑使用“%HI”格式字符串

这意味着

cout << "Book count: ";  wscanf_s(L"%i", &count);
应该是

cout << "Book count: ";  wscanf_s(L"%i", &count);
cout << "Book count: ";  wscanf_s(L"%hi", &count);

或者您应该将count设置为DWORD。

访问冲突是因为您在使用CreateFile打开的句柄上调用FindClose。FindClose仅用于关闭通过FindFirstFile获得的句柄


您需要调用CloseHandle。

您真的应该检查所有API调用的返回值,以确保一切正常。除了scanf错误之外,您还需要执行错误检查,您使用的是早已过时的TCHAR,您使用原始Win32 IO而不是C++ IO,并编写未初始化的结构。只要有可能,我就应该使用原始Win32方法。如果我有选择的话,我不会用这些。将添加错误检查。已更改,已添加。现在读取:SysLab4.exe中0x77D22312 ntdll.dll处的第一次偶然异常:0xC0000005:访问冲突写入位置0xFEFEFF1E。是否忽略编译器警告或未打开输出窗口?将计数更改为DWORD。仍然存在访问冲突…编译器仅警告第105行和第121行中的有符号/无符号不匹配,以及第122行中的转换为SHORT。VCib,此时你正在移动球门柱。推荐一个新的问题。或者启动开发环境附带的调试器。