Я пытаюсь добавить несколько байтов в двоичный файл в Visual C ++
// ConsoleApplication1.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"#include <windows.h>
#include <tlhelp32.h>
#include <tchar.h>
#include <iostream>
#include <string>
// Forward declarations:
void append(LPCTSTR);
int main()
{
LPCTSTR fn = L"C:/kaiyin/kybig.out";
append(fn);
printf("hello world\n");
std::string s = "";
std::getline(std::cin, s);
return 0;
}
void append(LPCTSTR filename) {
LARGE_INTEGER size;
size.QuadPart = 0;
HANDLE fh = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
GetFileSizeEx(fh, &size);
LPCVOID buf = "abc";
SetFilePointerEx(fh, size, NULL, FILE_BEGIN);
WriteFileEx(fh, buf, 3, NULL, NULL);
CloseHandle(fh);
}
Я получаю ошибку:
First-chance exception at 0x76AB8833 (KernelBase.dll) in ConsoleApplication1.exe: 0xC0000005: Access violation reading location 0x00000008.
If there is a handler for this exception, the program may be safely continued.
Что пошло не так?
Если я запускаю его без отладки, я получаю отчет о сбое, например:
Problem signature:
Problem Event Name: APPCRASH
Application Name: ConsoleApplication1.exe
Application Version: 0.0.0.0
Application Timestamp: 560255b2
Fault Module Name: KERNELBASE.dll
Fault Module Version: 6.3.9600.17415
Fault Module Timestamp: 54504ade
Exception Code: c0000005
Exception Offset: 000b8833
OS Version: 6.3.9600.2.0.0.256.48
Locale ID: 1033
Additional Information 1: 5861
Additional Information 2: 5861822e1919d7c014bbb064c64908b2
Additional Information 3: a10f
Additional Information 4: a10ff7d2bb2516fdc753f9c34fc3b069
Read our privacy statement online:
http://go.microsoft.com/fwlink/?linkid=280262
If the online privacy statement is not available, please read our privacy statement offline:
C:\Windows\system32\en-US\erofflps.txt
Основано на сайте MSDN для WriteFileEx
дескриптор файла может быть открыт любым FILE_FLAG_OVERLAPPED
флаг (что не так в вашем коде).
Изменение этой функции на WriteFile
работает как шарм.
Смотрите здесь для более подробной информации: WriteFileEx MSDN
Я предполагаю, что это происходит сбой, потому что память не выделяется для buf, buf используется без выделения памяти.