2016-05-18 20 views
-3

利用可能な書籍の著者、名前、および数を含む「ブック」構造体があります。構造体をファイルに書き込むときのアクセス違反

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ファイルを作成して、その中に「books」を追加しています。私はここで間違って何をやっている

Access violation writing location 0xFFFFFEFE.

:私はこれを行うたび

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); 

はしかし、私はエラーを取得しますか?

+0

これらのAPI呼び出しの_all_からの戻り値を確認して、機能していることを確認する必要があります。 – theB

+0

scanfエラーのほか、エラーチェックを行いますが、TCHARは古くから使われていますが、C++ IOではなく未処理のWin32 IOを使用し、初期化されていない構造体を書き出します。 –

+0

私は可能な限り生のWin32メソッドを使用することになっています。私は選択肢がある場合、私はこれらを使用していないだろう。エラーチェックを追加します。 – VCib

答えて

0

このライン

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

はおそらく、また、ファイルが開かれたことを確認する必要があり

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); 
} 

---編集---

あなたのコードをそのままVisual Stud IOは次の警告を与える:

c:\dev\test\test.cpp(14): warning C4477: 'wscanf_s' : format string '%i' requires an argument of type 'int *', but variadic argument 1 has type 'SHORT *'

c:\dev\test\test.cpp(14): note: consider using '%hi' in the format string

は、これが意味することは

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

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

をあるべきか、DWORDをカウントすべきであるということです。

+0

変更されました。今読み込みます。SysLab4.exeの0x77D22312(ntdll.dll)の最初の例外。0xC0000005:アクセス違反の書き込み場所0xFEFEFF1E。 – VCib

+0

コンパイラの警告を無視していますか、出力ウィンドウを開いていませんか? – kfsone

+0

@VCib編集を参照してください。 – kfsone

0

CreateFileで開かれたハンドルでFindCloseを呼び出しているため、アクセス違反が発生しています。 FindCloseは、FindFirstFileで取得したクローズハンドルのみです。

代わりにCloseHandleに電話する必要があります。

関連する問題