文件操作总结:关于文本和二进制流(typeText&typeBinary)
本人能力、精力有限,所言所感都基于自身的实践和有限的阅读、查阅,如有错误,欢迎拍砖,敬请赐教——博客园:钱智慧。
总结:
CFile,其自身是不提供缓冲区的(?但CFile又有一个Flush,这一点目前我还没弄明白),配合CArchive(CArchive类似一个缓冲区)为MFC的类提供序列化机制。文本的格式化输出建议用ofstream或者CStdioFile(通过CString配合)。可以通过构造绑定文件,采用typeBinary模式,不能使用typeText模式。是MFC文件操作体系中的基类。其静态成员函数(如GetStatus,配合CFileStatus)可以在不打开文件的情况下获取文件的相关信息,如长度,通过CFileStatus的m_size),或者进行相关操作:如删除、重命名。
CStdioFile,必须通过Open绑定文件,默认采用typeText模式,作为CFile子类,可以使用typeText,也可以使用typeBinary。
fstream是basic_fstream模板类的一个实例,关于文本和二进制,其默认模式是文本,可以通过指定ios::binary指明二进制模式,否则采取默认值。但要注意这是char版本的类。如果要技术Unicode,则需要用wfstream。如果通过fstream来获取文件大小,只能通过指针偏移,这一点不如CFileStatus配合CFile::GetStatus来得简便。
文本和二进制流:
区别在于读写时,对'\n'的解释。见代码:
// TODO: 在此添加控件通知处理程序代码
char* str="It's length is 20\nab";
CStdioFile f1;
CStdioFile f2;
f1.Open(TEXT("D:\\std_bin.txt"),CFile::modeCreate | CFile::modeWrite | CFile::typeBinary | CFile::shareDenyNone);
f1.Write(str,strlen(str));
f1.Close(); f2.Open(TEXT("D:\\std_text.txt"),CFile::modeCreate| CFile::modeWrite | CFile::typeText | CFile::shareDenyNone);
f2.Write(str,strlen(str));
f2.Close();
运行后会发现std_text.txt比std_bin.txt大一个字节,因为typeText模式下,写入字符串str时,会把\n扩展成\r\n写入到文件中。以后你必须再以typeText模式去读这个文件,\r\n才会再替换成\n。不然,会怎么样呢:
//for循环执行前,std_text.txt在磁盘上,长度是21个字节
for (int i=;i<;++i)
{
//循环里的逻辑是:先将std_text.txt以typeBinary模式式读进来,然后再
//用typeText模式写出去 CStdioFile f;
f.Open(TEXT("D:\\std_text.txt"),CFile::modeRead | CFile::typeBinary | CFile::shareDenyNone);
CFileStatus status;
f.GetStatus(TEXT("D:\\std_text.txt"),status);
//由于我们用于显示,只是用缓冲区承载读进来的文件内容,所以不考虑字符0
char* str=new char[status.m_size];
f.Read(str,status.m_size);
f.Close();
f.Open(TEXT("D:\\std_text.txt"),CFile::modeWrite | CFile::typeText | CFile::shareDenyNone);
f.Write(str,status.m_size);
f.Close();
}
初始内容就是第一段代码生成的,第二段代码(上面的代码)运行后,会发现std_text.txt在磁盘上的长度增加了100个字节。
所以,为了避免这种情况,最好遵循一个原则:以什么方式写就以什么方式读,这有点类似涉及到编码的文件读写了。
文件操作总结:关于文本和二进制流(typeText&typeBinary)的更多相关文章
- java 文件操作 读取txt文本(兄弟常开心)
测试一下读取文本的另一种方法:该方法只使用一个类读取了文件 注意:buffer和read方法中读取指定长度的一致 package com.swust; import java.io.*; /* * 数 ...
- asp.net文件操作类
/** 文件操作类 **/ #region 引用命名空间 using System; using System.Collections.Generic; using System.Text; usin ...
- 【python3之文件操作】
一.文件操作 1.文件处理的流程 1)打开文件,得到文件句柄并赋值给一个变量 2)通过句柄对文件进行操作 3)关闭文件 例如: f = open('chenli.txt') #打开文件 first_l ...
- 文件操作mode学习总结-----Python学习总结【第四篇】:Python之文件操作(文件、正则、json、pickle)
非常全的博客,防丢链接参考https://www.cnblogs.com/madsnotes/articles/5521551.html 1.文件操作 1.1 操作流程 1)文件打开 2)文件操作 3 ...
- C# 文件操作常用方法总结
需引用 System.IO Path为绝对路径 检测指定目录是否存在 Directory.Exists(Path) 创建目录 Directory.CreateDirectory(Path) 删除目录 ...
- C中文件操作的文本模式和二进制模式,到底有啥区别?
在C中,使用fopen打开文件有两种模式:一种是文本模式,一种是二进制模式.那这两种模式之间有什么区别,是不是使用文本模式打开的文件就只能使用文本函数比如fprintf来操作,而使用二进制打开的文件就 ...
- 文件操作IO流
fopen 打开文件或者生成文件 getc 向文件中读取一个字符 putc 向文件中写入一个字符 fgets 向文件中读取字符串 参数可以设置获取多少个字符串 fputs 向文件中写入字符串 不自动添 ...
- (二)C语言文本流和二进制流的区别
转至:http://www.cnblogs.com/xiangzi888/archive/2011/11/10/2244336.html 一.首先回答,什么是文件,流 一个文件通常就是磁盘上的一段命名 ...
- C语言中的文本流与二进制流的区别
近期看到了文本流和二进制流的区别,书上讲的比较含糊,理解不透彻,于是细细琢磨了下,把心得跟大家分享一下: 一.首先回答,什么是文件,流 一个文件通常就是磁盘上的一段命名的存储区.比如 stdio.h ...
随机推荐
- 使用vagrant作为开发环境后,js报错
当你尝试修改一个js,并且用同样的方法更新之后,会遇到类似的问题,是的,就算重启VM上任何服务,甚至重启VM,依旧没有用,当然,比起其他资源文件,浏览器的反应会强烈一些,因为浏览器会提示未知错误,而你 ...
- logback使用笔记
三大主要元素 looger:记录日志 appender:输出目的地 layout:输出格式 必要步骤: 一.引入包: import org.slf4j.Logger; import org.slf4j ...
- R语言的一些笔记
(1)包中函数必须在NAMESPACE中进行标记导出,否则就不认识了: 例如叫做rtest.Model.LogisticreRression 就能识别,而叫做Model.LogisticreRress ...
- WINIO64位模拟键鼠操作
最近玩游戏有点入迷,心急升级经验,于是某天开始"挂尸体",一系列手动操作之后决定写一个外挂,模拟一系列键盘和鼠标操作,没做过游戏winform也用得少,开始以为只要简单调用winA ...
- wpf单实例运行
默认情况下我们可以打开一个应用程序多个实例,例如你双击一个exe多次.当然有些时候这么做会带来很多好处,但是有时我们又不希望这么做,要避免这个问题其实很简单,同WinForm中单实例运行一个应用是一样 ...
- poj 2796 Feel Good 单调栈区间问题
Feel Good 题意:给你一个非负整数数组,定义某个区间的参考值为:区间所有元素的和*区间最小元素.求该数组中的最大参考值以及对应的区间. 比如说有6个数3 1 6 4 5 2 最大参考值为6,4 ...
- Python 学习日志(一)
第一天: (一)安装Python3.3: (二)试运行: 1.在IDLE中输入:print("Hello,world"); //回车查看结果 2.使用"File" ...
- centos 卸载vsftpd方法
centos 卸载vsftpd方法 在服务器上安装了vsftpd,配置出错需要卸载vsftpd.卸载vsftpd的命令如下: 1 [root@localhost ~]# rpm -aq vsftpd2 ...
- css3创建动画
@keyframes ico{ 0% { top: -100%; } 100%{ top:4%; } } @-webkit-keyframes ico{ 0% { top: -100%; } 100% ...
- Codeforces Round #210
A:简单题: #include<cstdio> using namespace std; int n,k; int main() { scanf("%d%d",& ...