Как дозаписать в файл с помощью WriteFile
Я написал код для дозаписи строки в файл
#include <windows.h>
#include <string>
int main()
{
HANDLE hFile = CreateFileA("C:\\Users\\user\\file.txt", GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0,0);
std::string str = "TEXT";
DWORD bytess;
DWORD toWrite = str.size();
LPCVOID n = "\n";
SetFilePointer(hFile, 0, 0, FILE_END);
WriteFile(hFile, n, toWrite, &bytess, 0);
WriteFile(hFile, str.c_str(), toWrite, &bytess, 0);
CloseHandle(hFile);
}
Но файл выглядит следующим образом
TEXT
Почему в нём присутствует табуляция, и как я могу совершить дозапись в файл без подобных проблем?
Ответы (1 шт):
Рассмотрим поподробнее аргументы функции WriteFile:
HANDLE hFile– хэндл открытого файлаLPCVOID lpBuffer– буфер, из которого брать данные для записиDWORD nNumberOfBytesToWrite– количество байтов, которые нужно записатьLPDWORD lpNumberOfBytesWritten– количество байтов, которые фактически были записаныLPOVERLAPPED lpOverlapped– ещё один спец. параметр, нам он здесь не интересен
Теперь посмотрим на Ваш вызов функции:
WriteFile(hFile, n, toWrite, &bytess, 0);
И рассмотрим два аргумента:
n – указатель на ОДИН символ
toWrite – длина строки "TEXT", равная ЧЕТЫРЁМ
Ответ напрашивается сам собой: Вы даёте функции один символ, а записать просите 4. Результат налицо: т.к. Вы передаёте указатель, границ функция не видит, а потому без проблем вписывает Ваш символ и ещё 3 байта, стоящих в памяти за ним, отображающихся в файле как пустые символы.
В доказательство можно открыть полученный файл чуть более продвинутым редактором, чем Блокнот:
В результате видим, что перед текстом действительно не символ табуляции, а перевод строки и три пустых символа – NUL.
Отсюда решение: если уж Вы пишете один символ, то передайте в соответствующем аргументе 1:
WriteFile(hFile, n, 1, &bytess, 0);
