第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

求vc的WriteFile函數(shù)輸入txt文件的簡(jiǎn)單問(wèn)題?

求vc的WriteFile函數(shù)輸入txt文件的簡(jiǎn)單問(wèn)題?

慕桂英3389331 2019-02-07 11:07:49
LPCTSTR buf=_T("Welcome");HANDLE hFile;DWORD dwBytesWritten;hFile=CreateFile(_T("\\My Documents\\ONE.TXT"),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);LPCTSTR buf=_T("張三李四");WriteFile(hFile,buf,wcslen(buf)*2,&dwBytesWritten,NULL);結(jié)果文件中漢字是亂碼,如果是英文或者數(shù)字每個(gè)字符中多了一個(gè)空格,請(qǐng)問(wèn)高手如何解決??
查看完整描述

3 回答

?
冉冉說(shuō)

TA貢獻(xiàn)1877條經(jīng)驗(yàn) 獲得超1個(gè)贊

最近在使用WriteFile函數(shù)時(shí)發(fā)現(xiàn),vc2008中unicode字符集下處理中文亂碼的一些解決方法,歸納如下

1. 寫入的時(shí)候采用多字節(jié)char類型
HANDLE hFile;
DWORD nBytes;
hFile=CreateFile(_T("test.txt"),GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
char msg[]="我是我的我";
if(hFile!=INVALID_HANDLE_VALUE)
{
WriteFile(hFile,msg, sizeof(msg) ,&nBytes,NULL);
CloseHandle(hFile);
}

2. 直接寫入unicode的頭字節(jié)
HANDLE hFile;
DWORD nBytes;
hFile=CreateFile(_T("test.out"),GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
WCHAR msg[]=L"我是我的我";
if(hFile!=INVALID_HANDLE_VALUE)
{
DWORD a=0xFEFF;
WriteFile(hFile,&a,sizeof(a),&nBytes,NULL);
WriteFile(hFile,msg, lstrlen(msg) * sizeof(TCHAR),&nBytes,NULL);//第三個(gè)參數(shù)可以直接sizeof(msg)
CloseHandle(hFile);
}
3. 使用WideCharToMultiByte轉(zhuǎn)換成多字節(jié)
(省略)
4. 使用wcstombs轉(zhuǎn)換成多字節(jié),需要引用wchar.h和locale.h
HANDLE hFile;
DWORD nBytes;
hFile=CreateFile(_T("test.out"),GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,0,NULL);
WCHAR msg[]=L"我是我的我";
if(hFile!=INVALID_HANDLE_VALUE)
{
char buf[sizeof(msg)];
setlocale(LC_ALL, ".936");
wcstombs(buf, msg, sizeof(msg));
WriteFile(hFile,buf, sizeof(buf),&nBytes,NULL);
CloseHandle(hFile);
}

//*********以下為讀入***********************//
hFile=CreateFile(_T("test.txt"),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_ALWAYS,0,NULL);
if(hFile!=INVALID_HANDLE_VALUE)
{
WCHAR line[256]={0};
BOOL bResult;
bResult=ReadFile(hFile,line,sizeof(line),&nBytes,NULL);
if(nBytes!=0)
{
printf("%s\r\n",line);
}
CloseHandle(hFile);
}



查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
有只小跳蛙

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個(gè)贊

用#include <stdio.h>不是更好嗎?
FILE * f = fopen(("\\My Documents\\ONE.TXT", "w");
fpritnf(f, "張三李四");
fclose(f);
就可以了,多簡(jiǎn)單啊!

查看完整回答
反對(duì) 回復(fù) 2019-03-18
?
侃侃無(wú)極

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊

因?yàn)槟銢](méi)有進(jìn)行字符的轉(zhuǎn)換,我們需要將buf進(jìn)行轉(zhuǎn)換。這就要用到了WideCharToMultiByte.如何用呢?
首先我的方法比較笨,可以這么用的:
char* pchBuffer = new char[dwLen+1];
WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, pchBuffer, dwLen+1, NULL, FALSE );
WriteFile(hFile, pBuffer, dwLen+1, &dwSize, NULL );
Delete[] pchBuffer;
此時(shí)注意,我在WriteFile中用了dwLen+1。結(jié)果就是在文件的末尾出現(xiàn)了亂碼,正好多一個(gè)亂碼出來(lái)。所以WriteFile中nNumberOfBytesToWrite是寫的字符串的數(shù)目,是不包括’\0’的。
此時(shí)注意,我在WriteFile中用了dwLen+1。結(jié)果就是在文件的末尾出現(xiàn)了亂碼,正好多一個(gè)亂碼出來(lái)。所以WriteFile中nNumberOfBytesToWrite是寫的字符串的數(shù)目,是不包括’\0’的。
這個(gè)方法笨,是因?yàn)槲覀兊暮瘮?shù)可以縮減為兩個(gè)參數(shù)。是因?yàn)槿缦逻@么寫時(shí),dwLen是所要轉(zhuǎn)換的字符串的個(gè)數(shù),此時(shí)轉(zhuǎn)換的字符串是包括’\0’的。
DWORD dwLen = WideCharToMultiByte(CP_ACP, NULL, pBuffer, -1, NULL, NULL, NULL, FALSE );



查看完整回答
反對(duì) 回復(fù) 2019-03-18
  • 3 回答
  • 0 關(guān)注
  • 1303 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)