CreateFile,WriteFile--文件读写

时间:2022-11-13 21:39:04
代码是这样的
        HANDLE hFile;
DWORD dwBytes;
TCHAR szBuf[100]=_TEXT("test");
        hFile=CreateFile(_TEXT("C:\\error.txt"),GENERIC_WRITE,FILE_SHARE_WRITE ,\
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
return;
}
WORD len=sizeof(szBuf)/sizeof(TCHAR);
SetFilePointer(hFile,len,NULL,FILE_CURRENT);

for (int i=1;i<5;i++)
{
WriteFile(hFile,&szSource,len,&dwBytes,NULL);
}

CloseHandle(hFile);
然后输出的文件会出现乱码
      \? 蘚? 烫烫烫\? 烫烫烫\? 烫烫烫\? 烫烫烫                                                  \? 烫烫烫烫t e s t                                                                                 \? 烫烫烫烫t e s t                                                                                 \? 烫烫烫烫t e s t                                                                                 \? 烫烫烫烫t e s t 
请问问题可能出现在哪地方?如何解决?谢谢哈

11 个解决方案

#1


TCHAR szBuf[100]=_TEXT("test"); 
===================
你的szBuf大小是100,但是只初始化了开头几个,后面没有初始化,而且最后也没有加"\0"表示字串结束.

#2


谢谢 wltg2001 
WriteFile(hFile,&szSource,len,&dwBytes,NULL);   莫名多了个dwBytes  ^_^ 自己的疏忽
WriteFile(hFile,&szBuf,len,&dwBytes,NULL);

#3


WriteFile(hFile,&szSource,len,&dwBytes,NULL); 
szSource未定义
用szBuf没有问题啊。

#4


TCHAR szBuf[100] = {0};
memcpy(szBuf, _T("test"), 100);

#5


        HANDLE hFile;
DWORD dwBytes;
TCHAR szBuf[100]={0};
TCHAR*szSource;
TCHAR* szDescription;
TCHAR* szError;
TCHAR* szErrorMessage;
szSource =(TCHAR*)e.Source();
szDescription=(TCHAR*)e.Description();
szError=(TCHAR*)(LPCSTR)e.Error();
szErrorMessage=(TCHAR*)(LPCSTR)e.ErrorMessage();
        wcscpy(szBuf,szSource);

 // to implement something

        hFile=CreateFile(_TEXT("C:\\error.txt"),GENERIC_WRITE,FILE_SHARE_WRITE ,\
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
return;
}
WORD len=sizeof(szBuf)/sizeof(TCHAR);
WriteFile(hFile,&szBuf,len,&dwBytes,NULL);
SetFilePointer(hFile,len,NULL,FILE_CURRENT);
CloseHandle(hFile);

我的目的是把所有的异常信息以某种格式写入文件,考虑过使用WCSCAT ,和SPRINTF_S,没成功,比如使用WCSCAT连接字符串,只有前面显示正常了,后面的是乱的,而且后面的信息会覆盖原来的,大家有没好的解决方案,谢谢哈。

#6


我一般使用ZeroMemory每次都清空一下buffer area

#7



读写文件本身并不复杂,我看你的问题是思路凌乱造成的。


1、首先确认一下你的工程是否为 UNICODE 工程?


2、先做一个简单的小例子,测试打开文件、移动指针、写文件等功能;


3、最后再做正式的程序。


第一点非常重要,如果连 UNICODE 是什么都不知道,那就一定要先解决这个问题。

#8


恩  是UNICODE的

#9


我想是这样的   将异常信息格式化,然后写入文件中,写入内容追加在文件尾。我再看看MSDN文档关于文件API函数的操作  ^_^
THANK YOU  zaodt.

#10



WriteFile

这个 API 函数写数据时,是按照 Byte 写的,这时如果是 UNICODE 工程,就需要注意了,如下:


CString str = _T("12345");

UNICODE 下,上面的字符串包含 5 个UNICODE字符,但它占用 10 个 Bytes ,在写文件时,就需要写入 10 个字节;


WriteFile(hFile,str,len,10,NULL);


这个地方一定要注意,写入 5 个字节肯定少写了。

#11


恩  ,收到。这个缓存大小也不好定义,因为也不知道后面会追加多少内容,可以使用PTCHAR?还有就是格式化字符串用哪个函数比较好。
PS:不能使用MFC,尽量用WINDOW API,C标准库函数都禁用,原因就是安全性太低 哎。。。

#1


TCHAR szBuf[100]=_TEXT("test"); 
===================
你的szBuf大小是100,但是只初始化了开头几个,后面没有初始化,而且最后也没有加"\0"表示字串结束.

#2


谢谢 wltg2001 
WriteFile(hFile,&szSource,len,&dwBytes,NULL);   莫名多了个dwBytes  ^_^ 自己的疏忽
WriteFile(hFile,&szBuf,len,&dwBytes,NULL);

#3


WriteFile(hFile,&szSource,len,&dwBytes,NULL); 
szSource未定义
用szBuf没有问题啊。

#4


TCHAR szBuf[100] = {0};
memcpy(szBuf, _T("test"), 100);

#5


        HANDLE hFile;
DWORD dwBytes;
TCHAR szBuf[100]={0};
TCHAR*szSource;
TCHAR* szDescription;
TCHAR* szError;
TCHAR* szErrorMessage;
szSource =(TCHAR*)e.Source();
szDescription=(TCHAR*)e.Description();
szError=(TCHAR*)(LPCSTR)e.Error();
szErrorMessage=(TCHAR*)(LPCSTR)e.ErrorMessage();
        wcscpy(szBuf,szSource);

 // to implement something

        hFile=CreateFile(_TEXT("C:\\error.txt"),GENERIC_WRITE,FILE_SHARE_WRITE ,\
NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE)
{
return;
}
WORD len=sizeof(szBuf)/sizeof(TCHAR);
WriteFile(hFile,&szBuf,len,&dwBytes,NULL);
SetFilePointer(hFile,len,NULL,FILE_CURRENT);
CloseHandle(hFile);

我的目的是把所有的异常信息以某种格式写入文件,考虑过使用WCSCAT ,和SPRINTF_S,没成功,比如使用WCSCAT连接字符串,只有前面显示正常了,后面的是乱的,而且后面的信息会覆盖原来的,大家有没好的解决方案,谢谢哈。

#6


我一般使用ZeroMemory每次都清空一下buffer area

#7



读写文件本身并不复杂,我看你的问题是思路凌乱造成的。


1、首先确认一下你的工程是否为 UNICODE 工程?


2、先做一个简单的小例子,测试打开文件、移动指针、写文件等功能;


3、最后再做正式的程序。


第一点非常重要,如果连 UNICODE 是什么都不知道,那就一定要先解决这个问题。

#8


恩  是UNICODE的

#9


我想是这样的   将异常信息格式化,然后写入文件中,写入内容追加在文件尾。我再看看MSDN文档关于文件API函数的操作  ^_^
THANK YOU  zaodt.

#10



WriteFile

这个 API 函数写数据时,是按照 Byte 写的,这时如果是 UNICODE 工程,就需要注意了,如下:


CString str = _T("12345");

UNICODE 下,上面的字符串包含 5 个UNICODE字符,但它占用 10 个 Bytes ,在写文件时,就需要写入 10 个字节;


WriteFile(hFile,str,len,10,NULL);


这个地方一定要注意,写入 5 个字节肯定少写了。

#11


恩  ,收到。这个缓存大小也不好定义,因为也不知道后面会追加多少内容,可以使用PTCHAR?还有就是格式化字符串用哪个函数比较好。
PS:不能使用MFC,尽量用WINDOW API,C标准库函数都禁用,原因就是安全性太低 哎。。。