[MFC学习笔记]--lesson12 文件操作

本文介绍了在MFC中进行文件操作的步骤,包括如何添加菜单项进行文件的读写,重点讲解了fopen、fwrite、fseek、fflush等函数的使用,并提醒在写入文件时要考虑数据初始化和文件长度的获取。最后提到了文本文件和二进制文件的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
 
 
}


 

 

  1. FILE *file;  
  2. file=fopen("demo2.txt","w");  
  3. char ch[3];  
  4. ch[0]='a';  
  5. ch[1]=10;//表示换行的ASCII码  
  6. ch[2]='b';  
  7. fwrite(ch,1,3,file);  
  8. 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();

     


     

     

     

     

     

     

     

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值