使用FILE指针读写文件
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指针读写文件的更多相关文章
- c# 命令行下编译c#文件 // c# file类读写文件
c# 命令行下编译c#文件 2010-03-01 15:02:14| 分类: c# 学习|字号 订阅 在 开始 ——>程序 ——>vstool中打开vs2008命令提示. 通过 ...
- 01.使用File类读写文件
使用File类去读数据: 方法一:使用ReadAllBytes(); 方法 namespace _01.使用File类读写数据01 { class Program { static void Main ...
- C使用FILE指针文件操作
文件的基本概念 所谓“文件”是指一组相关数据的有序集合. 这个数据集有一个名称,叫做文件名.实际上在前面的各章中我们已经多次使用了文件,例如源程序文件.目标文件.可执行文件.库文件 (头文件)等.文件 ...
- LINUX文件格式化读写(文件指针,缓冲)
body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...
- 使用QFile进行文件操作(QFile可以使用FILE *指针,还必须指定AutoCloseHandle)
QFile类我我们提供了操作文件的常用功能.它是一种io设备,可以用来读写文本文件和二进制文件,也可以用来读写Qt的资源文件.QFile类可以单独使用,该类本身提供了read/write函数,但更方便 ...
- JAVA基础学习之流的简述及演示案例、用缓冲区方法buffer读写文件、File类对象的使用、Serializable标记接口(6)
1.流的简述及演示案例输入流和输出流相对于内存设备而言.将外设中的数据读取到内存中:输入将内存的数写入到外设中:输出.字符流的由来:其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表. ...
- Python 读写文件和file对象(转)
1.open使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. file_object = open('thefile.txt ...
- Go标准库之读写文件(File)
Go标准库之读写文件(File) 创建一个空文件 package main import ( "log" "os" ) func main() { file, ...
- 文件指针/句柄(FILE*)、文件描述符(fd)以及 文件路径(filepath)的相互转换(转)
转自: http://blog.csdn.net/jenghau/article/details/5532265 文件指针/句柄(FILE*).文件描述符(fd)以及 文件路径(filepath)的相 ...
随机推荐
- SecureCRT 7.0破解
激活步骤如下: 1)准备工作:安装好SecureCRT软件,下载并得到该注册机. 2)保持SecureCRT软件关闭(运行的话会提示你正在运行的,关闭就好). 3)将注册机拷贝到你的CRT软件的安装的 ...
- http请求的GET和POST请求:查询和新增(server.php)
<?php //设置页面内容是html编码格式是utf-8 header("Content-Type: text/plain;charset=utf-8"); //heade ...
- python文件名不要跟模块名相同,报错AttributeError: 'module' object has no attribute 'Differ'
python中的文件都会生成pyc文件,包括模块也是这样,所以调用模块的时候,实际上会调用模块.pyc文件:在这个前提下,如果将文件名命名成跟模块名一样,在同一目录下就会生成一个跟模块名一样的pyc文 ...
- CF910C
题解: 首先考虑暴力不行 然后采用贪心 按位展开 然后注意不能有前缀0 代码: #include<bits/stdc++.h> using namespace std; ],ans; ], ...
- ZOJ 3696 Alien's Organ(泊松定理,期望值)
Alien's Organ Time Limit: 2 Seconds Memory Limit: 65536 KB There's an alien whose name is Marja ...
- nodejs之log4js日志记录模块简单配置使用
在我的一个node express项目中,使用了log4js来生成日志并且保存到文件里,生成的文件如下: 文件名字叫:access.log 如果在配置log4js的时候允许了同时存在多个备份log文件 ...
- Python3的基础语法(四)
1,编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串. 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -* ...
- IOS开发 多线程GCD
Grand Central Dispatch (GCD)是Apple开发的一个多核编程的解决方法. dispatch queue分成以下三种: 1)运行在主线程的Main queue,通过dispat ...
- 根据显示器的分辨率,加载不同CSS样式表
<link rel="stylesheet" type="text/css" id="css"><script langu ...
- I.MX6 linux eGalaxTouch 自动获取设备节点
I.MX6 linux eGalaxTouch 自动获取设备节点 \\\\\\\\\\\\\\-*- 目录 -*-///////////// | 一. 需求: | 二. /proc/bus/input ...