step1:新建一个单文档MFA App Wizard程序。
step2:在菜单项里添加“写入文件”和“读取文件”,在资源视图里,选着Menu然后双击就可添加,ID分别取为“IDM_FILE_WRITE”和"IDM_FILE_READ",
step3:在“写入文件”和“读取文件”上,右击鼠标,选着“Class Wizard”,然后就可以添加到CPropView类,然后,选着“Message”为“COMMAND”->AddFunction->Code
step4:就可以在生成的成员函数中,分别coding了 ,然后介绍各个关于文件操作的类和结构体以及函数。
FILE struct:Stores information about current state of stream; used in all stream I/O operations.
fopen函数:FILE *fopen( const char *filename, const char *mode); //open a file
第一个参数指向常量的指针类型,文件名,指出要打开的文件,第二也是指向常量的指针类型,打开的方式:
“r”:Opens for reading
"w":Opens an empty file for writing. If the given file exists, its contents are destroyed.
“a”:Opens for writing at the end of the file (appending) without removing the EOF marker before writing new data to the file; creates the file first if it doesn’t exist.
...具体看MSDN
fwrite函数:写入数据。写入数据后,然后有一个文件指针就会指在下一个文件写入的起始地址。那么怎么把调用后fwrite的指针移动到起始位置呢?用fseek();函数
size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
parameter1:第一个参数,是一个指向常量的指针,指向要写入的数据
parameter2:Item size in bytes 如果设置为1,就表示一个项的大小为1个字节,那么如果要传入6个字节,那么第三个参数要传入6.如果设置为2,第三个为3
如果我们传的是一个整型,那么就可以设置为4bit。
parameter3:Maximum number of items to be written
当缓存区没有满,那么是不回往磁盘写入文件,那么要 用fclose()函数,把文件关闭,就能够写入磁盘文件。但是下一次写入的时候,需要再次打开。
fflush:Flushes a stream刷新缓存区,这样就不需要关闭文件就能够让缓存区的文件输出。
fwrite("nihao",1,strlen("nihao"),pFile);
fseek(pFile,0,SEEK_SET); //将文件指针重新指到开头的位置
fwrite("123",1,strlen("123"),pFile);
fflush(pFile); //刷新缓存区域
这样就输出了123ao
知识补充,我们在往磁盘文件中写入数据的时候,要多写一个数据,多写的一个是空数据,那么在读的时候,就不会读出没有初始化的内存的部分。或者在recv的时候,记得
fwrite("nihao",1,strlen("nihao") + 1,pFile); //缺点,会增大文件的体积。
或者用。
memset(recvBuf,0,100); //这样在设置buff的时候,可以设置为0
我们在接收文件的时候,需要获得文件的长度,这样就可以按照文件的长度来定义recvBuf的长度了。
ftell():
Gets the current position of a file pointer.
先用fseek()将文件指针移动到文件的结尾处,然后用ftell获得current position of a file pointer,就可以得到文件的长度。
用完之后,记得将文件指针移动到文件的开头,记得用rewind函数。void rewind( FILE *stream);
void CFileView::OnFileRead()
{
// TODO: Add your command handler code here
FILE *pFile = fopen("1.txt","r");
// char readBuf[100];
//memset(readBuf,0,100);//初始化为0
//fread(readBuf,1,100,pFile);
//MessageBox(readBuf);
//fclose(pFile);
char *pBuf;
fseek(pFile,0,SEEK_END ); //将文件指针移动到了文件结尾
long len = ftell(pFile);
rewind(pFile); //将文件指标重新放到文件的开始处
pBuf = new char[len+1]; //多存放,用来存放\0
fread(pBuf,1,len,pFile);
pBuf[len] = 0;
MessageBox(pBuf);
fclose(pFile);
}
- FILE *file;
- file=fopen("demo2.txt","w");
- char ch[3];
- ch[0]='a';
- ch[1]=10;//表示换行的ASCII码
- ch[2]='b';
- fwrite(ch,1,3,file);
- fclose(file);
这个时候看到的文件属性显示的是4个字节而不是3个字节,这是因为默认的fopen类型是文本类型,换行前面自动加了一个字节的回车
读取文件的时候,我们会发现,能够读取出‘a’和‘b’,就算只读三个字节。。。。如果我们改成按照二进制文件打开
FILE *file;
file=fopen("demo2.txt","rb");
- char ch[3];
- ch[0]='a';
- ch[1]=10;//表示换行的ASCII码
- ch[2]='b';
- fread(ch,1,3,file);
- fclose(file);
这样读取的时候,只能读取一个‘a',而b 不见了。因为我们按照二进制格式打开,我们只读取三个字节的数据。所以,我们以文本方式和二进制方式读取文件是不一样的。为什么会这样呢 ?为什么文本方式只需要读三个字节就能读取四个字节的字符?
FILE *file;
file=fopen("demo2.txt","wb");
- char ch[3];
- ch[0]='a';
- ch[1]=10;//表示换行的ASCII码
- ch[2]='b';
- fwrite(ch,1,3,file);
- fclose(file);
现在我们按照二进制的方式写入,我们可以发现,当按照二进制方式写入的时候,我们得到的文本文件是3个字节,而不是按照文本方式写入的时候得到的4个字节,为什么以文本写入的时候会多加一个字节呢?为什么以文本读的时候,明明是4个字节,只需要读取3个字节呢?答案如下:
在以文本方式写入文本的时候,我们写入ASCII码 10 //’\n‘的ASCII码 的时候,则会转换成 回车-换行 也就是 存放两个ASCII码 值 13 10 ;
在以文本方式读取文件的时候,我们遇见 回车-换行 也就是遇见ASCII码为13 10组合时候,则会转换为换行字符 ASCII码 为10
我们按照二进制方式往文件写入数据的时候,则会将数据在内存中的存储形式原样输出到文件中。不会像文本文件输出和写入那样转换。
要正确区分文本方式和二进制方式,文本文件和二进制文件。就算是文本文件,我们也能按照二进制方式打开。
题:给你一个整数,例如:98341 将这个整数保存到文件中,要求在以记事本程序打开文件时,显示的98341.
FILE *pFile = fopen("3.txt","w"); int i = 98341; char ch[5]; char[0] = 9 + 48; //48是0的ASCII码 char[1] = 8 + 48; char[2] = 3 + 48; char[3] = 4 + 48; char[4] = 1 + 48; fwrite(char,1,5,pFile); fclose(pFlie);
或者
FILE *pFile = fopen("3.txt","w"); int i = 98341; char ch[5]; itoa(i,ch,10); //将int转换为char //存在ch[5],以十进制的方式存储 fwrite(ch,1,5,pFile); fclose(pFile);
在C++中可以用以下方式,但是用的比较少。
用ofstream的方式写入和读取
#include <fstream.h>
ofstream ofs("4.txt");
ofs.write("helloworld",strlen(("helloworld"));
ofs.close();
也可以用ifstream的方式写入和读取
#include <ifstream.h>
ifstream ifs("4.txt");
char ch[100];
memset(ch,0,100);
ifs.read(ch,100);
ifs.close();
MessageBox(ch);//显示读取的数据
/*********************************************************************/
win32 API 对文件操作的几个函数。。。
1.CreateFile
2.WriteFile
CFile类 write
CFile file("6.txt",CFile::modeCreate | CFile::modeWrite);
file.Write( "hello world" ,strlen("hello world"));
file.close();
2.READ
CFile file("6.txt",CFile::modeRead);
char *pBuf;
DWORD dwFileLen;
dwFileLen = file.GetLength();
pBuf = new char[dwFileLen+1];
pBuf[dwFileLen] = 0;
file.Read(pBuf,dwFileLen);
file.Close();
MessageBox(pBuf);
用CFileDialog类
CFileDialog fileDlg(FALSE);
fileDlg.m_ofn.lpstrTitle = "我的文件保存对话框";
fileDlg.m_ofn.lpstrTitle = "Text Files(*.txt)\0*.txt" //文件过滤功能。
fileDlg.DoModel();