C/C++知识点之C++对文件的操作
小标 2018-12-03 来源 : 阅读 1287 评论 0

摘要:本文主要向大家介绍了 C/C++知识点之C++对文件的操作,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

本文主要向大家介绍了 C/C++知识点之C++对文件的操作,通过具体的内容向大家展示,希望对大家学习C/C++知识点有所帮助。

Windows API函数

1.创建或打开文件

HANDLE hFile = ::CreateFile(_T("E:\\Program\\测试文件夹\\myfile.txt"), //创建或打开的文件
                                 GENERIC_READ| GENERIC_WRITE,   //文件存取方式(GENERIC_WRITE)
                                 FILE_SHARE_READ,//共享属性(FILE_SHARE_WRITE/DELETE)
                                 NULL,//安全属性
                                 OPEN_ALWAYS,//文件存在或不存在时采取的操作
                                 FILE_ATTRIBUTE_NORMAL, //新文件属性
                                 NULL);//文件模板的句柄
//文件存在或不存在时采取的操作有:(CREATE_ALWAYS  OPEN_ALWAYS (总能成功)// CREATE_NEW OPEN_EXISTING TRUNCATE_EXISTING(可能失败))
//文件属性有:FILE_ATTRIBUTE_(归档,隐藏,只读,系统,临时)
//可以加上对文件操作方式:FILE_FLAG_(关闭后立即清除,异步读写文件,不使用缓存直接写硬盘)
if (hFile == INVALID_HANDLE_VALUE)
{
     ::MessageBox(NULL, _T("不能够打开文件!"), _T("错误"), IDYES);
}

2.读写文件+移动文件指针

 CHAR wbuffer[256] = { ‘a‘,‘b‘,‘c‘,‘d‘,‘e‘,‘f‘,‘g‘,‘g‘,‘h‘,‘i‘,‘j‘,‘ ‘, ‘ ‘,‘ ‘ ,‘ ‘,‘ ‘,‘0‘ };
DWORD wByte;
::WriteFile(hFile, wbuffer, 256, &wByte, NULL);

::SetFilePointer(hFile, //文件句柄
                0,          //移动距离  (移动TXT时候只是在同一行,不会换行)
                NULL,           //移动距离的高32位
                FILE_BEGIN);    //移动的模式(FILE_(BEGIN\CURRENT\END)何处开始移动)
            //返回值是新的文件指针位置或-1(失败)

CHAR rbuffer[256] = {};
DWORD rByte;
::ReadFile(hFile, &rbuffer, 256, &rByte, NULL);

::SetEndOfFile(hFile);//移动文件结束标志EOF至文件指针位置
            //SetFilePointer+SetEndOfFile可以用来截断或者扩展文件
            //读写都是从文件指针位置开始的

3.锁定+解锁文件(阻止其他程序读写)

            ::LockFile(hFile,               //主要防止其他进程读写
                        0,      //起始位置
                        0,
                        1024,   //区域大小
                        0);
            ::UnlockFile(hFile,0,0,1024,0);

4.常用文件操作

DWORD fileType = ::GetFileType(hFile);//FILE_TYPE_CHAR/DISK/PIPE/UNKNOWN
DWORD fileSizeHigh;  //文件长度的高字
DWORD fileSize = ::GetFileSize(hFile, &fileSizeHigh);//文件长度低字
DWORD fileAttrubutes = ::GetFileAttributes(_T("E:\\Program\\测试文件夹\\myfile.txt"));
::CopyFile(_T("E:\\Program\\测试文件夹\\myfile.txt"),   //源文件
            _T("E:\\Program\\测试文件夹\\Copyfile.txt"), //目标文件
            FALSE);                              //若目标文件存在是否按出错处理
::DeleteFile(_T("E:\\Program\\测试文件夹\\Copyfile.txt"));//只能删除存在且非只读文件
::MoveFile(_T("E:\\Program\\测试文件夹\\myfile.txt"), _T("E:\\Program\\测试文件夹\\测试目录\\myfile.txt"));//(失败)
::MoveFileEx(_T("E:\\Program\\测试文件夹\\测试目录\\myfile.txt"),
             _T("E:\\Program\\测试文件夹\\myfile.txt"),
             MOVEFILE_REPLACE_EXISTING);//如果文件已经存在就替换
             //MOVEFILE_DELAY_UNTIL_REBOOT 直到重启再移动(若想下次启动就删除文件则第二个参数设置为NULL)
             //MOVEFILE_WRITE_THROUGH 直到原文件从磁盘删除再返回
::CloseHandle(hFile);//使用完毕就释放句柄

5.MFC对文件的操作(读写+移动指针)

//MFC  CFile类
CFile file,file1;
file.Open(_T("E:\\Program\\测试文件夹\\CFilemyfile.txt"), CFile::modeReadWrite | CFile::modeCreate|CFile::shareDenyWrite);
//默认是独占方式并且存在的文件长度会被截为0  (可以设置共享模式shareDenyNone等)
CFileException e;
file1.Open(_T("E:\\Program\\测试文件夹\\myfile.txt"), CFile::modeRead | CFile::modeCreate|CFile::modeNoTruncate,&e);
//CFile::modeNoTruncate长度不会被截为0

BYTE buffer1[4096] = { "abcdefghijklmnopqrstuvwxyz" };
file.Write(buffer1, 4096);  //写
file.Seek(0, FILE_BEGIN);   //移动文件指针
BYTE buffer[4096];          
UINT nBytesRead = file.Read(buffer, sizeof(buffer));  //读,返回未读取字节数
file.Close();

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C/C+频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程