fread和fwrite用法小结
fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出。
#include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值:读或写的记录数,成功时返回的记录数等于nmemb,出错或读到文件末尾时返回的记录
数小于nmemb,也可能返回0。
fread
和fwrite
用于读写记录,这里的记录是指一串固定长度的字节,比如一个int
、一个结构体或者一个定长数组。参数size
指出一条记录的长度,而nmemb
指出要读或写多少条记录,这些记录在ptr
所指的内存空间中连续存放,共占size * nmemb
个字节,fread
从文件stream
中读出size * nmemb
个字节保存到ptr
中,而fwrite
把ptr
中的size * nmemb
个字节写到文件stream
中。
nmemb
是请求读或写的记录数,fread
和fwrite
返回的记录数有可能小于nmemb
指定的记录数。例如当前读写位置距文件末尾只有一条记录的长度,调用fread
时指定nmemb
为2,则返回值为1。如果当前读写位置已经在文件末尾了,或者读文件时出错了,则fread
返回0。如果写文件时出错了,则fwrite
的返回值小于nmemb
指定的值。下面的例子由两个程序组成,一个程序把结构体保存到文件中,另一个程序和从文件中读出结构体
fread和fwrite的例子程序如下:
/* -------------------writerec.c--------------- */
#include <stdio.h>
#include <stdlib.h>
struct record {
char name[10];
int age;
};
int main(void)
{
struct record array[2] = {{"Ken", 24}, {"Knuth", 28}};
FILE *fp = fopen("recfile", "w");
if (fp == NULL) {
perror("Open file recfile");
exit(1);
}
fwrite(array, sizeof(struct record), 2, fp);
fclose(fp);
return 0;
}
/* -------------------readrec.c----------------- */
#include <stdio.h>
#include <stdlib.h>
struct record {
char name[10];
int age;
};
int main(void)
{
struct record array[2];
FILE *fp = fopen("recfile", "r");
if (fp == NULL) {
perror("Open file recfile");
exit(1);
}
fread(array, sizeof(struct record), 2, fp);
printf("Name1: %s\tAge1: %d\n", array[0].name, array[0].age);
printf("Name2: %s\tAge2: %d\n", array[1].name, array[1].age);
fclose(fp);
return 0;
}
$ gcc writerec.c -o writerec
$ gcc readrec.c -o readrec
发现生成的文件recfile不能直接打开。
原因:我们把一个struct record
结构体看作一条记录,由于结构体中有填充字节,每条记录占16字节,
把两条记录写到文件中共占32字节。该程序生成的recfile
文件是二进制文件而非文本文件,因为其
中不仅保存着字符型数据,还保存着整型数据24和28(在od
命令的输出中以八进制显示为030和034)。
注意,直接在文件中读写结构体的程序是不可移植的,如果在一种平台上编译运行writebin.c
程序,
把生成的recfile
文件拷到另一种平台并在该平台上编译运行readbin.c
程序,则不能保证正确读出
文件的内容,因为不同平台的大小端可能不同(因而对整型数据的存储方式不同),结构体的填充方式
也可能不同(因而同一个结构体所占的字节数可能不同,age
成员在name
成员之后的什么位置也可能不同)。
通过readrec程序读取文件recfile的内容,说明writerec程序的确记录成功写入recfile中。
从recfile读出的内容如下:
Name1: Ken Age1: 24
Name2: Knuth Age2: 28
fwrite和fread的应用举例:
1.将一个字符串写入文件:
char *str="hello,I am a test program!";
fwrite(str,sizeof(char),strlen(str),fp)
2.将一个字符数组写入文件:
char str[]={'a','b','c','d','e'};
fwrite(str,sizeof(char),sizeof(str),fp)
3.将一个整型数组写入文件:
int a[]={12,33,23,24,12};
先计算数组元素个数nmemb,之后
fwrite(a,sizeof(int),nmemb,fp)
注:由于程序生成的文件是二进制文件而非文本文件,因此,不用机器,整数的表达不同,
所以无法直接打开生成文件。可通过fread函数检验数据是否写入文件。
fread和fwrite用法小结的更多相关文章
- 函数fgets和fputs、fread和fwrite用法小结(转)
字符串读写函数fgets和fputs: 1.fgets()函数:原型char *fgets(char *s, int n, FILE *stream);从流中读取n-1(n默认1024)个字符之前,如 ...
- fwrite和fread函数的用法小结(转)
fwrite和fread是以记录为单位的I/O函数,fread和fwrite函数一般用于二进制文件的输入输出. #include <stdio.h> size_t fread(void * ...
- C编程中fread 、fwrite 用法总结
在C语言中进行文件操作时,我们经常用到fread()和fwrite(),用它们来对文件进行读写操作.下面详细绍一下这两个函数的用法. 我们在用C语言编写程序时,一般使用标准文件系统,即缓冲文件系统 ...
- 函数fgets和fputs、fread和fwrite、fscanf和fprintf用法小结 (转)
函数fgets和fputs.fread和fwrite.fscanf和fprintf用法小结 字符串读写函数fgets和fputs 一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符 ...
- C++之函数fgetc和fputc、fgets和fputs、fread和fwrite、fscanf和fprintf用法小结
#include <iostream> #include <cstdio> #include <cstdlib> using namespace std; int ...
- fread 和 fwrite 函数用法示例以及注意事项
1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,count,fp); 3.说明 ( ...
- C++:fread、fwrite函数用法
主要内容: fread.fwrite函数的用法 1.函数功能 用来读写一个数据块. 2.一般调用形式 fread(buffer,size,count,fp); fwrite(buffer,size,c ...
- Matlab 用fread、fwrite实现大文件读写
最近在分析一个35G的大数据文件,猛一看,是不是很吓人啊,不过还好,师兄写文件的格式非常规范,读取数据来也就很方便了,主要是使用了读写文件的两个函数fread和fwrite,下面用matlab简单尝试 ...
- open/fopen read/fread write/fwrite区别
fopen /open区别 UNIX环境下的C 对二进制流文件的读写有两套班子:1) fopen,fread,fwrite ; 2) open, read, write这里简单的介绍一下他们的区别.1 ...
随机推荐
- 在 Windows Azure 上设计多租户应用程序
作者:Suren Machiraju 和 Ralph Squillace 审校:Christian Martinez.James Podgorski.Valery Mizonov 和 Michael ...
- 81-POJ-Wall(计算几何)
http://poj.org/problem?id=1113 Wall Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 411 ...
- cacti-不出图形,cacti.log中出“ERROR: SQL Assoc Failed!
[root@CactiEZ log]# tail cacti.log 2016年04月06日 14:53:16 PM - CMDPHP: Poller[0] ERROR: SQL Cell Faile ...
- linux 下删除乱码文件-乾颐堂
在linux下删除文件,遇到特殊字符是一件非常头疼的事情. 1. 如果文件名带 ‘-’ 或者‘--’这样的字符 删除办法为:rm -- 文件名 如文件名为:-pythontab.tgz 如果用普通方法 ...
- Python使用日常
#Python中文件夹和文件的判断import os My_Path = "/home/lpworkstudy/Gooddir/" #现在我们判断这个文件夹是否存在 #如果不存在, ...
- html传参数 js工具类
var QueryUtils = { GetQueryString: function (name) { var reg = new RegExp("(^|&)" + na ...
- poi 获取excel数据 导入数据库
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; Map<String, ...
- javaScript总结51: 变量查找规则与词法作用域
作用域: 1 在es5.0中只有函数可以构成一个作用域 2 全局作用域: 整个js代码执行的环境 3 局部作用域: 函数可以构成一个局部作用域 4 全局变量: 在全局作用域中申明的变量 5 局部变量: ...
- JavaScript词法作用域经典练习题
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8& ...
- Linux软件包的管理
RPM软件包 RPM软件包一般的安装位置(分散): 管理程序:/sbin/* /usr/sbin/* 普通用户程序:/bin/* /usr/bin/* rpm -q ===> rpm -quer ...