文件操作:二进制文件和文本文件的区别。二进制文件将数据在内存中存在的模式原封不动的搬到文件中,而文本文件是将数据的asc码搬到文件中。
首先做一个读写文件的菜单,在CxxView里响应:
C++的方式:#include "fstream.h"
写:
ofstream ofs("c:\\1.txt");
ofs.write("猎狐网络",sizeof("猎狐网络"));
ofs.close();//最好自己将文件关掉,不关也行,这个filebuf对象的析构函数为你关。
读:
ifstream ifs("c:\\1.txt");
char buf[100];
MessageBox(buf);
当我们写的代码改为
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"));
发现此时默认按照文本写和读的时候,文件的大小不符。
这是因为在用文本文件方式读写的时候,碰到了asc码为10的字符,都将被转换,写文件的时候将10前面加上13写到了文件中,读文件读到13和10,将这两个字符换成一个10.注意在用ultraEdit看的时候不要转成DOS格式。
如果以二进制文件(ios::binary)进行读写的时候就没有这种问题存在。不做任何的转换。
C++的文件操作打开文件是在构造函数里完成,关闭文件是在析构函数里完成。
3. MFC的方式:
I. 写文件:
CFile f("c:\\1.txt",CFile::modeWrite|CFile::modeCreate);
f.Write("hello",5);
a.几个标志的作用:
CFile::modeCreate:没有指定的文件就产生一个新文件,有就打开该文件,并将它裁剪到0;
CFile::modeNoTruncate :打开文件时不裁剪到0;
b.写数据到文件末尾:
CFile f("c:\\1.txt",CFile::modeWrite|CFile::modeCreate|
CFile::modeNoTruncate);
f.SeekToEnd();
f.Write("hello",5);
//file.Close();如果我不关闭的话,其析构函数会为我关闭。
II. 读文件:
CFile f("c:\\1.txt",CFile::modeRead);
char buf[10];
memset(buf,0,10);
MessageBox(buf);
III. 文件对话框:
保存对话框:
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("猎狐网络",sizeof("猎狐网络"));
file.Close();
}
打开对话框:
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. 文本文件和二进制文件的区别:
文件文件是一种特殊的二进制文件,当它遇到回
车键10时,写入文件时会自动地在它的前面加一个13,而读出文件时遇到13 10 的组合时,又把它还原到10。而二进制文件就是把数据原封不动的写入文件,原封不动的再读取出来,没有文本文件的这种转换操作。
下面的代码演示了之间的这种区别:
写入文件时:
ofstream f("c:\\1.txt");
char buf[3];
buf[0]='a';
buf[1]='\n';
buf[2]='b';
f.write(buf,3);
读出文件时:
ifstream f("c:\\1.txt");
f.setmode(filebuf::binary);
char buf[5];
memset(buf,0,5);
CString str;
str.Format("%d,%d,%d,%d",buf[0],buf[1],buf[2],buf[3]);
MessageBox(str);
在写入文件时不指定格式,文件将按文本格式存储,此时读出文件时指定二进制格式,读出的数据如下图:
fopen和open区别如果注释f.setmode(filebuf::binary);语句,文件将按文本文件读出,如下图:
CStdioFile继承自CFile,一个CStdioFile 对象代表一个用运行时函数fopen 打开的C 运行时流式文件。
流式文件是被缓冲的,而且可以以文本方式(缺省)或二进制方式打开。文本方式提供对硬回车—换行符对的特殊处理。当你将一个换行符(0x0A)写入一个文本方式的CStdioFile 对象时,字节对(0x0D,0x0A)被发送给该文件。当你读一个文件时,字节对(0x0D,0x0A)被翻译为一个字节(0x0A)。
CStdioFile 不支持Duplicate,LockRange,和UnlockRange 这几个CFile 函数。如果在CStdioFile 中调用了这几个函数,将会出现CNoSupported 异常。
CStdioFile::ReadString(LPTSTR lpsz, UINT nMax);
读取一行文本到缓冲区,遇到“0x0D,0x0A”时停止读取,并且去掉硬回车“0x0D”,保留换行符“0x0A”,在字符串末尾添加“\0”(0x00)。nMax个字符里包含0x00这个字符。分析如下:
1)如果nMax <= 字符数,读取(nMax-1)个字符 + 0x00
2)如果nMax = 字符数 + 1,读取nMax个字符 + 0x00
3)如果nMax > 字符数,读取nMax个字符 + 0x0A + 0x00
CStdioFile::ReadString(CString &rString);(重载)
读取一行文本到rString,遇到回车换行符停止读取。回车和换行符不读到rString,而且末尾也没有添加“\0”。
CStdioFile::WriteString( LPCTSTR lpsz );(不支持CString直接写入)
将一个缓冲区中的数据写入与CStdioFile 对象关联的文件中。结束的空字符(“\0”)不被写入该文件。lpsz 中的所有换行符都被以一个硬回车换行符对写入该文件,即“\n”被转化成“\r\n”写入到文件里。
CFile的派生类CStdioFile提供了对文件进行流式的操作功能。其中函数void CStdioFile::WriteString( L
PCTSTR lpsz )写入一个字符串,需要给字符串lpsz的末尾加上换行标志”\r\n”;函数bool CStdioFile::ReadString(CStrin
g &rString )从文件中读取一行,如果文件未读完返回true,否则返回false。
比如:写入文件的例子
//创建文件
CStdioFile file;
file.Open("ts.txt",CFile::modeCreate|CFile::modeWrite);
//写入文件
CString str;
str.Format("%s\r\n","hello!I am talkingmute!");
file.Seek(0,CFile::end);
file.WriteString( str );
//关闭文件
file.Close();
比如:读文件的例子
CString strText = “”;
CString szLine = “”;
//打开文件
CStdioFile file;
file.Open("ts.txt",CFile::modeRead);
//逐行读取字符串
while( file.ReadString( szLine ) )
{
strText += szLine;
}
MessageBox(strText);
//关闭文件
file.Close();
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论