Lesson8:文件读写操作
计算机编程中,文件操作是常用和必备技能。本文主要讲解了文件的写入和读取方法。
1. 文件
文件是在计算机内存中以二进制表示的数据在外部存储介质上的另一种存放形式。文件通常分为二进制文件和文本文件。
二进制文件和文本文件
二进制文件是包含在ASCII 及扩展ASCII 字符中编写的数据或程序指令的文件。一般是可执行程序、图形、图象、声音等等文件。
文本文件(也称为ASCII文件):它的每一个字节存放的是可表示为一个字符的ASCII代码的文件。它是以 “行”为基本结构的一种信息组织和存储方式的文件,可用任何文字处理程序阅读的简单文本文件。
文本方式和二进制方式
当我们按照文本方式往文件中写入数据时,一旦遇到换行字符(ASCII为10),则会转换为回车-换行(ASCII为13、10)。在读取文件时,一旦遇到回车-换行的组合(即连续的ASCII 13、10),则会转换为换行字符(ASCII为10)。
当我们按照二进制方式往文件中写入数据,则将数据在内存中的存储形式原样输出到文件中。
2. 文件写入
在菜单栏上添加文件菜单,子菜单上添加写入文件和读取文件菜单,ID号修改为IDM_FILE_WRITE和IDM_FILE_READ,然后通过向导产生响应函数。
void CFileView::OnFileWrite()
{
//TODO: 在此添加命令处理程序代码
/* C语言写一个字符串
FILE*pFile;
fopen_s(&pFile,"1.txt","w+"); //与旧版本的fopen() 函数不一样了; 文件指针将接收打开的文件指针指向 的指针。
fwrite("http://www.sunxin.org",1, strlen("http://www.sunxin.org"), pFile); //写入的字符,每个字符大小,写入的字符数,被写入文件
//fseek(pFile,0,SEEK_SET); //重新定位写入的位置(文件指针,偏移量,位置)
//fwrite("http://www.天津.org",1, strlen("http://www.天津.org"),pFile);
fclose(pFile); //关闭文件,将缓冲区内容写入文件
//fflush(pFile); //刷新缓冲区,fclose()会关闭文件,不会关闭文件,只是将缓冲器内容写入
*/
/* 二进制方式读写三个字符
FILE*pFile;
fopen_s(&pFile,"2.txt", "wb");
charch[3];
ch[0]= 'a';
ch[1]= 10; //换行
ch[2]= 'b';
fwrite(ch,1,3,pFile);
fclose(pFile);
*/
/* 在文本中显示98341
FILE*pFile;
fopen_s(&pFile,"3.txt", "w");
//inti = 98341;
//charch[5];
//itoa(i,ch,10);
char*ch="98341";
//charch[5];
//ch[0]= 9 + 48;
//ch[1]= 8 + 48;
//ch[2]= 3 + 48;
//ch[3]= 4 + 48;
//ch[4]= 1 + 48;
fwrite(ch,1,5,pFile);
fclose(pFile);
*/
/*使用C++的ofstream写入文件
std::ofstreamofs("4.txt");
ofs.write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
ofs.close();
*/
/*用win32对文件操作函数实现写入 createfile()函数 writefile()函数
HANDLEhFile;
hFile= CreateFile("5.txt",GENERIC_WRITE,0,NULL,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,NULL); //(文件名,访问方式,共享类型,安全属性,如何创建,文件属性,模板文件句柄)
DWORDdwWrite;
WriteFile(hFile,"http://www.sunxin.org", strlen("http://www.sunxin.org"),&dwWrite, NULL); //(文件句柄,指向缓冲区的指针(将从缓冲区写入文件),写多少字节,实际写入字节数,指向overlap的指针)
CloseHandle(hFile);
*/
/*用CFile类对文件操作函数实现写入
CFilefile("6.txt",CFile::modeCreate|CFile::modeWrite);
file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
file.Close();
*/
//CFileDialog类用产生保存对话框
CFileDialogfileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle="myOPEN file"; //对话框名
fileDlg.m_ofn.lpstrFilter= "Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"; //过滤功能,每一个都要有 \0开始
fileDlg.m_ofn.lpstrDefExt= "txt"; //设置文件缺省的扩展名
if (IDOK==fileDlg.DoModal())
{
CFilefile(fileDlg.GetFileName(), CFile::modeCreate | CFile::modeWrite);
file.Write("http://www.sunxin.org",strlen("http://www.sunxin.org"));
file.Close();
}
}
3. 文件读取
void CFileView::OnFileRead()
{
//TODO: 在此添加命令处理程序代码
/* C语言读一个字符串
FILE*pFile;
fopen_s(&pFile,"1.txt", "r"); //读取文件到文件指针pFile所指向的内存
char*pBuf;
fseek(pFile,0, SEEK_END); //将文件指针移动到结尾
intlen = ftell(pFile); //求出读出文件大小
pBuf= new char[len + 1];
rewind(pFile); //将文件指针移动到开始处
fread(pBuf,1, len, pFile); //将读取文件从缓冲区放入指针pBuf
pBuf[len]= '\0';
MessageBox(pBuf);
fclose(pFile);
*/
/*以二进制方式读取文件
FILE*pFile;
fopen_s(&pFile,"2.txt", "rb");
charch[100];
fread(ch,1, 3, pFile);
ch[3]= 0;
MessageBox(ch);
fclose(pFile);
*/
/*使用ifstream写入文件
std::ifstreamifs("4.txt");
charch[100];
//memset(ch,0, 100); //将ch前100个字符写入字符0;
ifs.read(ch,100);
ifs.close();
MessageBox(ch);
*/
/*用win32对文件操作函数实现读取 readfile()函数
HANDLEhFile;
hFile= CreateFile("5.txt", GENERIC_READ, 0, NULL, OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
charch[100];
DWORDdwReads;
ReadFile(hFile,ch, 100, &dwReads, NULL); //(文件句柄,指向缓冲区的指针(将接收从文件中读取的数据),从文件中读取多少字节,实际读取的字节数,指向overlap的指针)
ch[dwReads]= 0;
CloseHandle(hFile);
MessageBox(ch);
*/
/*用CFile类对文件操作函数实现读取
CFilefile("6.txt", CFile::modeRead );
char*pBuf;
DWORDdwFileLen;
dwFileLen= file.GetLength();
pBuf= new char[dwFileLen+1];
pBuf[dwFileLen]= 0;
file.Read(pBuf,dwFileLen);
file.Close();
MessageBox(pBuf);
*/
CFileDialogfileDlg(TRUE);
fileDlg.m_ofn.lpstrTitle= "my READ file"; //对话框名
fileDlg.m_ofn.lpstrFilter= "Text Files(*.txt)\0*.txt\0All Files(*.*)\0*.*\0\0"; //过滤功能,每一个都要有 \0开始
fileDlg.m_ofn.lpstrDefExt= "txt"; //设置文件缺省的扩展名
if (IDOK== fileDlg.DoModal())
{
CFilefile(fileDlg.GetFileName(), CFile::modeRead);
char*pBuf;
DWORDdwFileLen;
dwFileLen= file.GetLength();
pBuf= new char[dwFileLen + 1];
pBuf[dwFileLen]= 0;
file.Read(pBuf,dwFileLen);
file.Close();
MessageBox(pBuf);
}
}