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. RabbitMQ(3) Java客户端使用

    RabbitMQ针对不同的开发语言(java,python,c/++,Go等等),提供了丰富对客户端,方便使用.就Java而言,可供使用的客户端有RabbitMQ Java client. Rabbi ...

  2. 【Html 学习笔记】第四节——框架

    我们经常使用的网页可能不是一个单独的网页,而是多个嵌套的,那么就需要用到下面的技术. 垂直框架:<frameset cols=""> 这里需要注意的是:四个网页需要同时 ...

  3. APUE学习笔记——6.10 时间与时间例程 time_t

           Unix提供的最基本的时间服务室日历时间(纪元时间),也就是计算1970年1月1日0时0分0秒到当前的秒数.该秒数用time_t表示. typedef long time_t; /* 时 ...

  4. (一) ffmpeg filter学习-使用流程

    FFMPEG中有一个类库:libavfilter.该类库提供了各种视音频过滤器.之前一直没有怎么使用过这个类库,最近看了一下它的使用说明,发现还是很强大的,有很多现成的filter供使用,完成视频的处 ...

  5. Kotlin Reference (二) Idioms

    most from reference 一些常用操作 创建单例类 object 数据类data classList.Map.Array的简单操作Lazy延迟加载属性空类型?空类型表达式?..?:.?. ...

  6. MQTT再学习 -- 漫谈MQTT协议

    先占楼,稍后再讲.先搭建好MQTT服务器和客户端

  7. tableView 三级展开 嵌入collocationView

    目前有个需求,需要在写一个文件夹结构的类型,tableView分类显示 collocationView 遇到的问题是:tableView cell中嵌套了 collocationView 后,coll ...

  8. Android学习笔记之Activity详解

    1 理解Activity Activity就是一个包含应用程序界面的窗口,是Android四大组件之一.一个应用程序可以包含零个或多个Activity.一个Activity的生命周期是指从屏幕上显示那 ...

  9. fedora22 安装fcitx 输入法

    <h4>安装fcitx:</h4><blockquote>sudo yum install fcitx fcitx-pinyin fcitx-configtools ...

  10. HTML中name,value属性区分

    name和value区分(注重前后台的结合),个人笔记使用^_^ 前台 后台对于单选框来说,name是一样的,决定后台的键名,value的值决定了后台键值 复选框同理,但name应该是不同的