为什么 WriteFile 写文件中间好多空格

满衣兄 2009-06-16 04:32:03

#define LOGFILE_PATH _T("\\log.txt")
static void _writeLog(const TCHAR* msg) {
TCHAR appPath[256];
GetCurrentDirectory(256,(LPTSTR)appPath);
lstrcat(appPath, LOGFILE_PATH);
HANDLE h = CreateFile(appPath, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, 0, 0);
if (INVALID_HANDLE_VALUE != h) {
if (INVALID_SET_FILE_POINTER != SetFilePointer(h, 0, 0, FILE_END)) {
DWORD cb = lstrlen(msg) * sizeof *msg;
WriteFile(h, msg, cb, &cb, 0);
}
CloseHandle(h);
}
}

这个代码写文件,写出的结果如下,谁能告诉我是为什么?

T S S ( L ) 0 : 0 8 : 2 7 : 3 0 : 0 0 2 7 a u d i o c h a t . c p p ( 7 7 ) : - - L o g i n s u c c e s s !

T S S ( L ) 0 : 0 8 : 2 7 : 3 0 : 0 0 5 9 e n d p o i n t . c p p ( 1 9 ) : - - _/T昢B\
g!



...全文
410 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
满衣兄 2009-06-16
  • 打赏
  • 举报
回复

HANDLE h = CreateFile(appPath, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, 0, 0);
if (INVALID_HANDLE_VALUE != h)
{
if (INVALID_SET_FILE_POINTER != SetFilePointer(h, 0, 0, FILE_END))
{
USES_CONVERSION;
DWORD cb = strlen(T2A(msg)) * sizeof *T2A(msg);
WriteFile(h,T2A(msg), cb, &cb, 0);
//WriteFile(h,msg, cb, &cb, 0);
}
CloseHandle(h);
}

自己弄好了,谢谢
满衣兄 2009-06-16
  • 打赏
  • 举报
回复
谢谢,问题还是没有解决.
满衣兄 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 Loaden 的回复:]
Unicode规范中有一个BOM的概念。
BOM是Byte Order Mark的简写,就是字节序标记,这个东西在普通文本编辑器下是看不到的,可以说它是文件头吗?在二进制编辑器下才可以看到?可能是这样。
在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收…
[/Quote]
谢谢.
我只关心这段代码需要怎么修改啊.这段话好象对我没什么帮助.
老邓 2009-06-16
  • 打赏
  • 举报
回复
Unicode规范中有一个BOM的概念。
BOM是Byte Order Mark的简写,就是字节序标记,这个东西在普通文本编辑器下是看不到的,可以说它是文件头吗?在二进制编辑器下才可以看到?可能是这样。
在UCS 编码中有一个叫做”ZERO WIDTH NO-BREAK SPACE”的字符,它的编码是FEFF。而FFFE在UCS中是不存在的字符,所以不应该出现在实际传输中。UCS规范建议我们在传输字节流前,先传输字符”ZERO WIDTH NO-BREAK SPACE”。这样如果接收者收到FEFF,就表明这个字节流是Big-Endian的;如果收到FFFE,就表明这个字节流是Little- Endian的。因此字符”ZERO WIDTH NO-BREAK SPACE”又被称作BOM。
UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明编码方式。字符”ZERO WIDTH NO-BREAK SPACE”的UTF-8编码是EF BB BF。所以如果接收者收到以EF BB BF开头的字节流,就知道这是UTF-8编码了。Windows就是使用BOM来标记文本文件的编码方式的。
dl591944556 2009-06-16
  • 打赏
  • 举报
回复
踩踩
老邓 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yfqvip 的回复:]
引用 6 楼 hikaliv 的回复:
全角么????????

关键一看你的程序编码,就是 charset 是什么,再者就看你的 log.txt 的编码方式是什么。

如果二者的编码方式不同,则会出现乱码。

很可能你的charset 是unicode 而你的 log.txt 的默认是 asni


charset 是Unicode .写出来之后文件是asni.请问怎么在程序里设置文件为Unicode格式呢?
[/Quote]
写入BOM
满衣兄 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 hikaliv 的回复:]
全角么????????

关键一看你的程序编码,就是 charset 是什么,再者就看你的 log.txt 的编码方式是什么。

如果二者的编码方式不同,则会出现乱码。

很可能你的charset 是unicode 而你的 log.txt 的默认是 asni
[/Quote]
charset 是Unicode .写出来之后文件是asni.请问怎么在程序里设置文件为Unicode格式呢?
老邓 2009-06-16
  • 打赏
  • 举报
回复
或不使用tchar.h,不使用TCHAR、_T宏,改用char
老邓 2009-06-16
  • 打赏
  • 举报
回复
看看在哪定义了UNICODE和_UNICODE

或:在代码最开始处,
#undef UNICODE
#undef _UNICODE
光宇广贞 2009-06-16
  • 打赏
  • 举报
回复
全角么????????

关键一看你的程序编码,就是 charset 是什么,再者就看你的 log.txt 的编码方式是什么。

如果二者的编码方式不同,则会出现乱码。

很可能你的charset 是unicode 而你的 log.txt 的默认是 asni
满衣兄 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 Loaden 的回复:]
如果你写中文,就会发现会乱码。
[/Quote]

static void _writeLog(const TCHAR* msg)
{
GetAllPath getPath;
CString appPath = getPath.GetAppPath()+_T("log.txt");

HANDLE h = CreateFile(appPath, GENERIC_WRITE, FILE_SHARE_READ, 0, OPEN_ALWAYS, 0, 0);
if (INVALID_HANDLE_VALUE != h) {
if (INVALID_SET_FILE_POINTER != SetFilePointer(h, 0, 0, FILE_END)) {
DWORD cb = lstrlen(msg) * sizeof *msg;

DWORD dwSize = 0;

DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, msg, -1, NULL, NULL, NULL, FALSE );

char* pchBuffer = new char[dwLen];

WideCharToMultiByte(CP_ACP, NULL, msg, -1, pchBuffer, dwLen, NULL, FALSE );

WriteFile(h, msg, dwLen+1, &dwSize, NULL );

delete[] pchBuffer;

//WriteFile(h,msg, cb, &cb, 0);
}
CloseHandle(h);
}
}

改成这样还是中间好多空格.
满衣兄 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 Loaden 的回复:]
你写的是Unicode,每个字母占两个字节
[/Quote]
请问要怎么修改呢?
老邓 2009-06-16
  • 打赏
  • 举报
回复
如果你写中文,就会发现会乱码。
老邓 2009-06-16
  • 打赏
  • 举报
回复
你写的是Unicode,每个字母占两个字节
goodname 2009-06-16
  • 打赏
  • 举报
回复
看起来像是unicode

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧