本帖最后由 mxwawaawxm 于 2022-7-24 11:19 编辑
[C] 纯文本查看 复制代码 #include <windows.h>
#include <tchar.h>
void SaveFileData(PCTSTR szFileName, LPCVOID szFileData, DWORD dwNumberOfBytesToWrite);
int WINAPI WinMain(HINSTANCE hHinstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
PCTSTR szFileData = TEXT("这是一个例子。");
PCTSTR szFileName = TEXT("d:\\test\\1.txt");
SaveFileData(szFileName, szFileData, (DWORD)sizeof(szFileData));
_tprintf(TEXT("%I64u\n"), sizeof(szFileData));
return 0;
}
void SaveFileData(PCTSTR szFileName, LPCVOID szFileData, DWORD dwNumberOfBytesToWrite)
{
// 文件句柄
HANDLE hFileWrite;
// 成功写入的数据大小
DWORD dwNumberOfBytesWritten;
// 打开文件
hFileWrite = CreateFile(szFileName, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
// 判断是否打开成功
if (hFileWrite==INVALID_HANDLE_VALUE) {
_tprintf(TEXT("打开 %s 文件失败。错误代码是:%lu。\n"), szFileName, GetLastError());
} else{
// 设置文件指针到文件末
SetFilePointer(hFileWrite, 0, 0, FILE_END);
// 写入文件
if (!WriteFile(hFileWrite, szFileData, dwNumberOfBytesToWrite, &dwNumberOfBytesWritten, NULL)) {
_tprintf(TEXT("写入 %s 文件失败。错误代码是:%lu。\n"), szFileName, GetLastError());
} else {
_tprintf(TEXT("写入 %s 文件成功。写入的字节总数:%lu。\n"), szFileName, dwNumberOfBytesWritten);
}
}
CloseHandle(hFileWrite);
}
代码如上。请大佬们看看。
运行结果如下
写入的数据定义在这里,PCTSTR szFileData = TEXT("这是一个例子。");
这个字符串有8个字符。我特意用sizeof(szFileData)计算了长度,并打印出来了。
结果显示8,但文本文件只显示4个字符。
我经过排查,发现是WriteFile函数的第3个参数,不能用sizeof(szFileData),而应该用lstrlen(szFileData)获得的长度。这样才能正确写入。
sizeof(szFileData)和lstrlen(szFileData)得出的长度居然很不一样。一个是14,一个是8。
请问大佬们,为什么WriteFile函数的第三个参数不能用sizeof(szFileData),而要用lstrlen(szFileData)。谢谢。
|