我用C++,使用win32 api,写文件时出现了乱码,求解释和解决,万分感谢!
vs2005,VC,将unicode字符串写入文件,只要第一个字符不是汉字,用notepad++打开写好的文件,可以正常显示,但是如果字符串第一个字符串是汉字,则文件里面...
vs2005,VC,将unicode字符串写入文件,只要第一个字符不是汉字,用notepad++打开写好的文件,可以正常显示,但是如果字符串第一个字符串是汉字,则文件里面全部都是乱码。
源码:
#include<iostream>
using namespace std;
#include <Windows.h>
class Log{
public:
Log(){
hFile = NULL;
}
~Log(){
CloseHandle( hFile);
}
bool Append( PCTSTR content){
if( ! hFile) return false;
DWORD bytesWritten;
printf( "Strlen:%u\n", lstrlen( content));
if( 0 == WriteFile( hFile, content, sizeof( TCHAR) * lstrlen( content), & bytesWritten, NULL)){
return false;
}
return true;
}
bool Open( PCTSTR filename){
if( ! hFile) CloseHandle( hFile);
hFile = CreateFile( TEXT("log.txt"), GENERIC_ALL, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( INVALID_HANDLE_VALUE == hFile){
return false;
}else{
return true;
}
}
private:
HANDLE hFile;
};
int main(){
Log * log = new Log();
if( ! log->Open( TEXT("log.txt"))) printf( "无法打开文件\n");
else if( ! log->Append( TEXT("我是谁"))){
printf( "无法写文件\n");
}else{
printf( "完成\n");
}
return 0;
} 展开
源码:
#include<iostream>
using namespace std;
#include <Windows.h>
class Log{
public:
Log(){
hFile = NULL;
}
~Log(){
CloseHandle( hFile);
}
bool Append( PCTSTR content){
if( ! hFile) return false;
DWORD bytesWritten;
printf( "Strlen:%u\n", lstrlen( content));
if( 0 == WriteFile( hFile, content, sizeof( TCHAR) * lstrlen( content), & bytesWritten, NULL)){
return false;
}
return true;
}
bool Open( PCTSTR filename){
if( ! hFile) CloseHandle( hFile);
hFile = CreateFile( TEXT("log.txt"), GENERIC_ALL, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( INVALID_HANDLE_VALUE == hFile){
return false;
}else{
return true;
}
}
private:
HANDLE hFile;
};
int main(){
Log * log = new Log();
if( ! log->Open( TEXT("log.txt"))) printf( "无法打开文件\n");
else if( ! log->Append( TEXT("我是谁"))){
printf( "无法写文件\n");
}else{
printf( "完成\n");
}
return 0;
} 展开
2个回答
展开全部
unicode文件需要在文件开始添加文件头声明这是unicode文件,比如在打开文件后就写入:
bool Open( PCTSTR filename){
if( ! hFile) CloseHandle( hFile);
hFile = CreateFile( TEXT("log.txt"), GENERIC_ALL, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if( INVALID_HANDLE_VALUE == hFile){
return false;
}else{
WORD bom = 0xFEFF;
DWORD bytesWritten;
WriteFile(hFile, &bom, 2, &bytesWritten, NULL);
return true;
}
}
当然你需要再增加一些代码判断文件是空的时候才写入,以及增加相应的错误处理
2013-11-22
展开全部
写入这两个字符 BYTE bom[2]={0xff,0xfe};
追问
您说的也对,不过只能选一个最佳答案 =_= 还是谢谢您,学习了!
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询