将struct写入文件时发生访问冲突

时间:2016-05-18 20:05:59

标签: 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", 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。

我在这里做错了什么?

2 个答案:

答案 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打开的句柄上调用了CreateFileFindClose仅用于关闭通过FindFirstFile获得的句柄。

您需要拨打CloseHandle