一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

轉(zhuǎn)載:MFC文件操作,很全面

 tuzi1015 2010-08-25
文件操作:二進(jìn)制文件和文本文件的區(qū)別。二進(jìn)制文件將數(shù)據(jù)在內(nèi)存中存在的模式原封不動(dòng)的搬到文件中,而文本文件是將數(shù)據(jù)的asc碼搬到文件中。
首先做一個(gè)讀寫文件的菜單,在CxxView里響應(yīng)
1.C的方式:
fwrite:
size:Item size in bytes 每次寫多少個(gè)字節(jié)
count:Maximum number of items to be written ,總共寫幾次。

FILE *p;
p=fopen("c:\\1.txt","w");
fwrite("abc",1,4,p);
fclose(p);
由于我們打開文件后文件就被映射到內(nèi)存中的緩存中,我們對(duì)文件所做的操作都是在內(nèi)存中完成的,如果我們不關(guān)閉文件,則內(nèi)存中對(duì)文件所做的修改就不會(huì)反映(保存)到硬盤中,除非你把當(dāng)前一個(gè)應(yīng)用程序關(guān)閉,這是會(huì)自動(dòng)執(zhí)行文件關(guān)閉的操作。
fflush可以在文件不關(guān)閉的情況下將一個(gè)流(緩沖區(qū))當(dāng)中的數(shù)據(jù)清空,這里的清空是把緩沖區(qū)的數(shù)據(jù)輸出到硬盤。這樣可以達(dá)到邊寫邊輸出的效果。
FILE* pFile=fopen("c:\\1.txt","w");
fwrite("獵狐網(wǎng)絡(luò)",1,strlen("獵狐網(wǎng)絡(luò)"),pFile);
//fclose(pFile);
fflush(pFile);
fwrite("how are you",1,strlen("獵狐網(wǎng)絡(luò)"),pFile);
fflush(pFile);
fclose(pFile);
我們發(fā)現(xiàn)下一次的“h”是寫在了上次的“心”后面了,這是因?yàn)椋瑢?duì)于文件來說它有一個(gè)文件字符位置的指針,這個(gè)指針不同于文件的指針,是文件結(jié)構(gòu)中這個(gè)char *_ptr;成員。當(dāng)我們寫完“心”字后,這個(gè)指針就在“心” 字后,所以下次寫“h”的時(shí)候就是在“心”的后面寫。如果想將第二句在“維”的前面輸出,則要移動(dòng)文件的位置指針,用fseek
FILE* pFile=fopen("c:\\1.txt","w");
fwrite("獵狐網(wǎng)絡(luò)",1,strlen("獵狐網(wǎng)絡(luò)"),pFile);
//fclose(pFile);
fflush(pFile);
fseek(pFile,0,SEEK_SET);
fwrite("北京",1,strlen("北京"),pFile);
fflush(pFile);
fseek(pFile,0,SEEK_END);
CString str;
str.Format("文件大小:%d",ftell(pFile));
MessageBox(str);
fclose(pFile);
讀文件
FILE* pFile=fopen("c:\\1.txt","r");
char buf[100];
fread(buf,1,100,pFile);//雖然讀出的數(shù)據(jù)超出了實(shí)際字符串的長度,但輸出時(shí)還是找’\0’
MessageBox(buf);
fclose(pFile);
出現(xiàn)了亂碼,是因?yàn)檩敵鑫募臅r(shí)候沒有及時(shí)找到’\0’.將寫文件的strlen改為sizeof
文件讀寫函數(shù)需要讀寫的時(shí)候?qū)?#8217;\0’帶上,它類似于printf和strlen等函數(shù)以’\0’作為函數(shù)結(jié)束表示。
亂碼的解決也可以用
FILE* pFile=fopen("c:\\1.txt","r");
char buf[100];
fseek(pFile,0,SEEK_END);
long len=ftell(pFile);
rewind(pFile);
fread(buf,1,len,pFile);
buf[len]=0;
MessageBox(buf);
fclose(pFile);
第三種方法:
FILE* pFile=fopen("c:\\1.txt","r");
char buf[100];
memset(buf,0,100);//可以用任意的字符來填充這個(gè)內(nèi)存塊。
ZeroMemory(buf,100);// 只能用‘\0’字符來填充這個(gè)內(nèi)存塊。
fread(buf,1,100,pFile);
MessageBox(buf);
fclose(pFile);
2.C++的方式:#include "fstream.h"
寫:
ofstream ofs("c:\\1.txt");
ofs.write("獵狐網(wǎng)絡(luò)",sizeof("獵狐網(wǎng)絡(luò)"));
ofs.close();//最好自己將文件關(guān)掉,不關(guān)也行,這個(gè)filebuf對(duì)象的析構(gòu)函數(shù)為你關(guān)。
讀:
ifstream ifs("c:\\1.txt");
char buf[100];
ifs.read(buf,100);
MessageBox(buf);
當(dāng)我們寫的代碼改為                         
ofstream ofs("c:\\1.txt");
char str[3];
str[0]='a';
str[1]=10;
str[2]='b';
ofs.write(str,sizeof(str));
   ofs.seekp(0);
ofs.write("china",sizeof("china"));
發(fā)現(xiàn)此時(shí)默認(rèn)按照文本寫和讀的時(shí)候,文件的大小不符。
這是因?yàn)樵谟梦谋疚募绞阶x寫的時(shí)候,碰到了asc碼為10的字符,都將被轉(zhuǎn)換,寫文件的時(shí)候?qū)?0前面加上13寫到了文件中,讀文件讀到13和10,將這兩個(gè)字符換成一個(gè)10.注意在用ultraEdit看的時(shí)候不要轉(zhuǎn)成DOS格式。
如果以二進(jìn)制文件(ios::binary)進(jìn)行讀寫的時(shí)候就沒有這種問題存在。不做任何的轉(zhuǎn)換。
C++的文件操作打開文件是在構(gòu)造函數(shù)里完成,關(guān)閉文件是在析構(gòu)函數(shù)里完成。
3. MFC的方式:
I. 寫文件:
CFile f("c:\\1.txt",CFile::modeWrite|CFile::modeCreate);
f.Write("hello",5);
a.幾個(gè)標(biāo)志的作用:
  CFile::modeCreate:沒有指定的文件就產(chǎn)生一個(gè)新文件,有就打開該文件,并將它裁剪到0;
  CFile::modeNoTruncate :打開文件時(shí)不裁剪到0;
b.寫數(shù)據(jù)到文件末尾:
CFile f("c:\\1.txt",CFile::modeWrite|CFile::modeCreate|
CFile::modeNoTruncate);
      f.SeekToEnd();
f.Write("hello",5);
//file.Close();如果我不關(guān)閉的話,其析構(gòu)函數(shù)會(huì)為我關(guān)閉。
II. 讀文件:
CFile f("c:\\1.txt",CFile::modeRead);
char buf[10];
memset(buf,0,10);
f.read(buf,5);
MessageBox(buf);
III. 文件對(duì)話框:
保存對(duì)話框:

CFileDialog fdlg(false);
//fdlg.m_ofn.lpstrTitle="獵狐制造!";
fdlg.m_ofn.lpstrDefExt="txt";
fdlg.m_ofn.lpstrFilter="文本文件 (*.txt)\0*.txt\0所有文件 (*.*)\0*.*\0\0";
if(IDOK==fdlg.DoModal())
{
//MessageBox(fdlg.GetFileName());
CFile file(fdlg.GetFileName(),CFile::modeCreate|CFile::modeWrite);
file.Write("獵狐網(wǎng)絡(luò)",sizeof("獵狐網(wǎng)絡(luò)"));
file.Close();
}

打開對(duì)話框:

CFileDialog fdlg(true);
//fdlg.m_ofn.lpstrTitle="獵狐制造!";
fdlg.m_ofn.lpstrFilter="文本文件 (*.txt)\0*.txt\0所有文件 (*.*)\0*.*\0\0";
if(IDOK==fdlg.DoModal())
{  
CFile file(fdlg.GetFileName(),CFile::modeRead);
char buf[100];
file.Read(buf,100);
MessageBox(buf);
}
2. 文本文件和二進(jìn)制文件的區(qū)別:
文件文件是一種特殊的二進(jìn)制文件,當(dāng)它遇到回車鍵10時(shí),寫入文件時(shí)會(huì)自動(dòng)地在它的前面加一個(gè)13,而讀出文件時(shí)遇到13 10 的組合時(shí),又把它還原到10。而二進(jìn)制文件就是把數(shù)據(jù)原封不動(dòng)的寫入文件,原封不動(dòng)的再讀取出來,沒有文本文件的這種轉(zhuǎn)換操作。
下面的代碼演示了之間的這種區(qū)別:
  寫入文件時(shí):
   ofstream f("c:\\1.txt");
   char buf[3];
   buf[0]='a';
   buf[1]='\n';
   buf[2]='b';
   f.write(buf,3);
讀出文件時(shí):
ifstream f("c:\\1.txt");
f.setmode(filebuf::binary);
char buf[5];
memset(buf,0,5);
f.read(buf,5);
CString str;
str.Format("%d,%d,%d,%d",buf[0],buf[1],buf[2],buf[3]);
MessageBox(str);
    在寫入文件時(shí)不指定格式,文件將按文本格式存儲(chǔ),此時(shí)讀出文件時(shí)指定二進(jìn)制格式,讀出的數(shù)據(jù)如下圖:
     
如果注釋f.setmode(filebuf::binary);語句,文件將按文本文件讀出,如下圖:

二、 注冊(cè)表的操作
1. 讀寫win.ini文件:
使用API的GetProfileInt和WriteProfileString來實(shí)現(xiàn)一個(gè)保存窗口大小的例子。
在CMainFrame的
void CMainFrame::OnDestroy()
{
CFrameWnd::OnDestroy();

// TODO: Add your message handler code here
CRect rect;
GetWindowRect(&rect);
CString str;
str.Format("%d",rect.Width());
WriteProfileString("窗口尺寸","寬度",str);
str.Format("%d",rect.Height());
WriteProfileString("窗口尺寸","高度",str);
}

在CMainFrame的
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
if( !CFrameWnd::PreCreateWindow(cs) )
   return FALSE;
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.cx=GetProfileInt("窗口尺寸","寬度",100);
cs.cy=GetProfileInt("窗口尺寸","高度",100);
return TRUE;
}

演示使用API的GetProfileString.對(duì)于它的第四個(gè)參數(shù)lpReturnedString需要添一個(gè)char*來返回。這里不能添CString對(duì)象來返回,這是一個(gè)特殊的地方。別的函數(shù)一般要char*的時(shí)候都可以用CString對(duì)象來代替。
這里我們用CString的GetBuffer來添這個(gè)char*。
A CString object consists of a variable-length sequence of characters.
因?yàn)橐粋€(gè)字符串對(duì)象由一序列長度可變的字符組成。

Returns a pointer to the internal character buffer for the CString object. The returned LPTSTR is not const and thus allows direct modification of CString contents.
返回一個(gè)CString對(duì)象內(nèi)部字符的緩沖區(qū)(字符數(shù)組)的指針,這個(gè)返回的指針不是一個(gè)常量的指針,因而允許直接修改指針?biāo)赶虻腃String對(duì)象的內(nèi)容。這個(gè)指針和CString內(nèi)部字符數(shù)組的地址是相等的。

If you use the pointer returned by GetBuffer to change the string contents, you must call ReleaseBuffer before using any other CString member functions.
如果你使用這個(gè)通過GetBuffer返回的指針改變了字符串的內(nèi)容,你在使用CString其他成員函數(shù)之前必須調(diào)用ReleaseBuffer。

在CWinApp的InitInstance里
CString str;
::GetProfileString("窗口尺寸","高度","無值",str.GetBuffer(100),100);
AfxMessageBox(str);
下面測(cè)試CWinApp的WriteProfileString,GetProfileString。
對(duì)于WriteProfileString有段說明
· In Windows NT, the value is stored to a registry key.
· In Windows 3.x, the value is stored in the WIN.INI file.
· In Windows 95, the value is stored in a cached version of WIN.INI
在CWinApp的InitInstance里
WriteProfileString("獵狐","vc++","菜鳥");

CString str;
str=GetProfileString("獵狐","vc++","無效值");
AfxMessageBox(str);
所以這里寫的話是寫到了HKEY_CURRENT_USER\Software\Local AppWizard-Generated Applications\MyFile\維新里。

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)數(shù)器,來限制軟件的使用次數(shù):
SetRegistryKey(_T("myboleApp"));
int x=GetProfileInt("test","times",0);
if(x>=5)
   return false;
WriteProfileInt("test","times",++x);
CString str;
str.Format("你還能使用%d次",5-x);
AfxMessageBox(str);

2. 讀寫WIN32注冊(cè)表,做兩個(gè)菜單進(jìn)行注冊(cè)表的讀寫操作,寫的時(shí)候先打開所要操作鍵,也就是返回操作鍵的句柄用RegCreateKey(這個(gè)句柄包含主鍵和子鍵,第一個(gè)參數(shù)可以是一個(gè)已打開的句柄或者一個(gè)預(yù)定義的保留的句柄值,如果是前面這個(gè)已打開的句柄,那么可以根據(jù)這個(gè)已打開句柄和后面子鍵的參數(shù),在這個(gè)已打開鍵的下面創(chuàng)建一個(gè)新的句柄),然后根據(jù)得到的這個(gè)句柄去讀寫。
在使用RegSetValue進(jìn)行寫操作的時(shí)候,寫的類型必須是REG_SZ,這個(gè)類型可以理解成已’\0’結(jié)尾的字符串,如果我們想寫別的數(shù)據(jù)類型,使用RegSetValueEx.
The RegSetValue function sets the data for the default or unnamed value of a specified registry key. The data must be a text string.
RegSetValue函數(shù)為默認(rèn)的或沒有名字的指定的注冊(cè)表鍵設(shè)置數(shù)據(jù),這個(gè)數(shù)據(jù)必須是字符串。
RegSetValue最后一個(gè)參數(shù)不包括’\0’
使用新函數(shù)在注冊(cè)表任意位置讀寫:
寫:
HKEY hKey;
RegCreateKey(HKEY_LOCAL_MACHINE,"software\\獵狐",&hKey);
//RegSetValue(hKey,NULL,REG_SZ,"WeiXin",6);
//RegSetValue(hKey,"課程",REG_SZ,"WeiXin",6);
DWORD i=100;//下面的參數(shù)要的是地址,所以這里要定義這個(gè)變量
RegSetValueEx(hKey,"JSP",NULL,REG_DWORD,(CONST BYTE*)&i,4);
RegCloseKey(hKey);
讀:in bytes以字節(jié)為單位

讀一個(gè)默認(rèn)鍵的值:
char *buf;
long len;
RegQueryValue(HKEY_LOCAL_MACHINE,
"software\\獵狐網(wǎng)絡(luò)\\mylyhu\\abc",NULL,&len);
buf=new char[len];
RegQueryValue(HKEY_LOCAL_MACHINE,
"software\\獵狐網(wǎng)絡(luò)\\mylyhu\\abc",buf,&len);
MessageBox(buf);
delete [] buf;

RegQueryValue參數(shù)說明:
If lpValue is NULL, and lpcbValue is non-NULL, the function returns ERROR_SUCCESS, and stores the size of the data, in bytes, in the variable pointed to by lpcbValue. This lets an application determine the best way to allocate a buffer for the value's data.
如果lpValue是NULL,并且lpcbValue不是NULL,這個(gè)函數(shù)返回ERROR_SUCCESS,并且通過lpcbValue所代表這個(gè)變量的指針存儲(chǔ)數(shù)據(jù)的字節(jié)單位的的大小,這是讓一個(gè)應(yīng)用程序按照最好的方式去為查詢值的數(shù)據(jù)分配空間

讀一個(gè)有名字的鍵的值。
HKEY hKey;
RegCreateKey(HKEY_LOCAL_MACHINE,"software\\維新",&hKey);
DWORD dwType;
DWORD data;
DWORD len=4;
RegQueryValueEx(hKey,"JSP",NULL,&dwType,(BYTE*)&data,&len);
CString str;
str.Format("%d",data);
MessageBox(str);
::RegCloseKey(hKey);

鎖注冊(cè)表:
HKEY hKey;
RegCreateKey(HKEY_CURRENT_USER,"software\\microsoft\\windows\\currentversion\\policies\\system",&hKey);
DWORD x=1;
RegSetValueEx(hKey,"DisableRegistryTools",0,REG_DWORD,(CONST BYTE*)&x,4);
RegCloseKey(hKey);

解注冊(cè)表
HKEY hKey;
RegCreateKey(HKEY_CURRENT_USER,"software\\microsoft\\windows\\currentversion\\policies\\system",&hKey);
DWORD x=0;
RegSetValueEx(hKey,"DisableRegistryTools",0,REG_DWORD,(CONST BYTE*)&x,4);
RegCloseKey(hKey);

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多

    国产精欧美一区二区三区久久| 国产欧美另类激情久久久| 激情综合五月开心久久| 国产一级精品色特级色国产| 狠狠做五月深爱婷婷综合| 亚洲免费黄色高清在线观看| 国内尹人香蕉综合在线| 一级欧美一级欧美在线播| 国产精品一区二区三区黄色片| 欧美六区视频在线观看| 国产欧美日产久久婷婷| 国产精品免费视频久久| 国产精品欧美激情在线| 色哟哟精品一区二区三区| 国产伦精品一一区二区三区高清版| 九九九热视频免费观看| 麻豆视传媒短视频在线看| 久久精品视频就在久久| 亚洲午夜福利视频在线| 男女午夜视频在线观看免费| 黑色丝袜脚足国产一区二区| 内射精子视频欧美一区二区| 超碰在线播放国产精品| 午夜小视频成人免费看| 五月婷婷缴情七月丁香| 日本人妻的诱惑在线观看| 欧美国产日韩变态另类在线看| 色婷婷视频免费在线观看| 国产综合欧美日韩在线精品| 国产又大又猛又粗又长又爽| 神马午夜福利免费视频| 亚洲熟妇熟女久久精品| 九九热九九热九九热九九热| 国内精品伊人久久久av高清| 国产一区二区在线免费| 国产午夜精品美女露脸视频| 日韩中文字幕视频在线高清版 | 国产欧美日韩综合精品二区| 深夜福利欲求不满的人妻| 国产免费黄片一区二区| 国产成人精品一区二三区在线观看 |