http://www.cnblogs.com/Solstice/archive/2011/07/17/2108715.html

看了这篇博客有感而发。

就个人而言我是典型的从C到C++的类型,并且逐渐去掉C风格,用C++风格代替,所以几乎不用FILE*读写。

iostream一个显著的优点是流运算符,我以前做一些数学计算类程序时深刻体会到它的优点,不用像printf一样针对特定类型编写特定的format,流运算符还能被重载,方便将说明结果输出到文本文档中,能体现面向对象程序设计的优越性。(当然就像链接中提到的,用iostream控制格式反倒非常麻烦,不如format简短,还能被外部配置文件利用。)

此时,除非是程序对IO性能要求很高,我还是会选用iostream。

但是,在读写特定格式二进制文件时(比如我目前在做的图像处理),两者在语法上差异不大,但是效率上FILE*好多了,即使关闭stdio同步。

http://www.cplusplus.com/reference/cstdio/,C++官网直接看各函数的使用方式,这里就不详述了,还是用个典型例子说明。

// 功能:读取BMP图像文件头,将文件头信息输出到文本文档中
#include <cstdio> typedef unsigned short WORD;
typedef unsigned long DWORD;
int main()
{
char szFileName[] = "C:\\Miss2.bmp";
FILE* fp = fopen(szFileName, "r");
if (!fp)
{
fprintf(stdout, "读取失败!\n");
return -1;
} WORD bfType; // 文件类型,必须为“BM”
fread(&bfType, sizeof(bfType), 1, fp);
if (!(bfType == (int)'B' + ((int)'M' << 8)))
{
fprintf(stdout, "文件类型不正确!\n");
return -1;
} DWORD bfSize; // 指定位图文件的大小,以字节表示
fread(&bfSize, sizeof(bfSize), 1, fp); // 移动指针跳过文件头的两个保留字,SEEK_SET为起始位置
fseek(fp, sizeof(WORD) * 3 + sizeof(DWORD), SEEK_SET);
//fseek(fp, sizeof(WORD) * 2, SEEK_CUR); // 有误? DWORD bfOffBits; // 指定从实际图像数据到文件头起始的偏移字节数
fread(&bfOffBits, sizeof(bfOffBits), 1, fp); fclose(fp); // 把文件头信息写入文档中
fp = fopen("C:\\Miss2.bmp文件头描述.txt", "w");
fprintf(fp, "位图文件大小:\t%ld\n", (long)bfSize);
fprintf(fp, "位图数据大小:\t%ld\n", (long)(bfSize - bfOffBits));
fclose(fp); return 0;
}

从代码中可以看出有不少重复代码,以多次用到的fread为例。

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );

size:单个数据类型的大小,一般直接用sizeof(T);

count:数据元素个数。(注意,如果是要读取到字符数组,由于字符数组要以'\0'结尾,所以此时count应为strlen(sz),其中sz为数组名,然后在数组的末尾置为'\0')

如果封装成模板函数,template<typename T, int N>会简洁许多。

就像开头链接中建议的,实际可以自己封装下FILE指针,最好还是用现成的IO库。

至于要用stream方式做logging以后再看看吧,暂时用不着先不研究。

使用FILE指针读写文件的更多相关文章

  1. c# 命令行下编译c#文件 // c# file类读写文件

    c# 命令行下编译c#文件 2010-03-01 15:02:14|  分类: c# 学习|字号 订阅     在 开始  ——>程序 ——>vstool中打开vs2008命令提示. 通过 ...

  2. 01.使用File类读写文件

    使用File类去读数据: 方法一:使用ReadAllBytes(); 方法 namespace _01.使用File类读写数据01 { class Program { static void Main ...

  3. C使用FILE指针文件操作

    文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件 ...

  4. LINUX文件格式化读写(文件指针,缓冲)

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. 使用QFile进行文件操作(QFile可以使用FILE *指针,还必须指定AutoCloseHandle)

    QFile类我我们提供了操作文件的常用功能.它是一种io设备,可以用来读写文本文件和二进制文件,也可以用来读写Qt的资源文件.QFile类可以单独使用,该类本身提供了read/write函数,但更方便 ...

  6. JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)

    1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...

  7. Python 读写文件和file对象(转)

    1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.txt ...

  8. Go标准库之读写文件(File)

    Go标准库之读写文件(File) 创建一个空文件 package main import ( "log" "os" ) func main() { file, ...

  9. 文件指针/句柄(FILE*)、文件描述符(fd)以及 文件路径(filepath)的相互转换(转)

    转自: http://blog.csdn.net/jenghau/article/details/5532265 文件指针/句柄(FILE*).文件描述符(fd)以及 文件路径(filepath)的相 ...

随机推荐

  1. js中页面加载完成后执行的几种方式及执行顺序

    1:使用jQuery的$(function){}; 2:使用jquery的$(document).ready(function(){});前两者本质上没有区别,第1种是第2种的简写方式.两个是docu ...

  2. IceScrum敏捷开发工具的安装文档-官方最新版

    Welcome to the iceScrum iceScrum install guide. If you don’t want to manage your own iceScrum instal ...

  3. hdu 1817 Necklace of Beads(Polya定理)

    Necklace of Beads Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others ...

  4. 配置django上传文件目录的http访问

    1.假设你的html模版文件使用以下路径来访问上传文件内容: url="{{ MEDIA_URL }}{{ images.image }}" 2.设置settings文件: MED ...

  5. zset类型以及其操作

    sorted set类型 sorted sets类型以及其操作zset是set的一格升级版本,它在set的基础上增加了一格顺序属性,这一属性在添加元素的同时可以指定,每次指定后,zset会自动重新按照 ...

  6. js 删除数组的指定元素

    //为数组对象增加相应的的方法,直接调用数组的removeByValue方法即可删除指定元素 Array.prototype.removeByValue = function (val) { for ...

  7. mac下iterm2快捷方式

    mac下iterm2,一些技巧,做个记录,大部分参考别人的加上自己的补充: 其中option + 左右键来跳转单词还是有问题,结果变为[D[C,等我摸索好了再来补充. 窗口 新建tab:⌘ + t 切 ...

  8. C#单元测试Nunit小结(20141018)

    1. 下载和安装Nunit工具: NUnit是一款堪与JUnit齐名的开源的回归测试框架,供.net开发人员做单元测试之用,可以从www.nunit.org网站上免费获得,然后在系统中安装: 2. 在 ...

  9. oracle数据库导入导出09192255

    1.导入数据库(dmp) Linux系统中: 1. 用root账号登录服务器,然后切换到oracle账号(安装oracle数据库的时候用的用的账号) 2. 切换到oralce的安装目录下的bin下 3 ...

  10. css工具类封装

    温馨提示:一下css封装,建议按需使用,否则会造成很大的代码冗余,且很多样式会造成不符合预期的效果,建议合理使用 <a href="https://meyerweb.com/eric/ ...