fread,fwrite,fopen,fclose .fseek用法

1.用法:
int fread(void *buffer,int size,int count,FILE *fp);
int fwrite(void *buffer,int size,int count,FILE *fp);
2.功能:
fread()——从fp所指向文件的当前位置开始,一次读入size个字节,重复count次,并将读入的数据存放到从buffer开始的内存中;  buffer是存放读入数据的起始地址(即存放何处)。
fwrite()——从buffer开始,一次输出size个字节,重复count次,并将输出的数据存放到fp所指向的文件中。buffer是要输出数据在  内存中的起始地址(即从何处开始输出)。
一般用于二进制文件的处理。

3.fseek用法
int fseek(FILE *stream, long offset, int fromwhere);
第一个参数file指针
第二个参数移动的偏移量
第三个参数移动到哪里
分别用3个宏
SEEK_SET 既0 文件开头
SEEK_CUR 既1 文件当前位置
SEEK_END 既2 文件结尾
但不推荐用数字 最好用宏
简言之:
fseek(fp,100L,SEEK_SET);把fp指针移动到离文件开头100字节处;
fseek(fp,100L,SEEK_CUR);把fp指针移动到离文件当前位置100字节处;
fseek(fp,100L,SEEK_END);把fp指针退回到离文件结尾100字节处。
此函数常用来计算流的长度:
   int filesize = fseek( fp, 0, SEEK_END );
   fseek( fp, 0, SEEK_SET );
fopen(打开文件)
相关函数
open,fclose
表头文件
#include<stdio.h>
定义函数
FILE * fopen(const char * path,const char * mode);
函数说明
参数path字符串包含欲打开的文件路径及文件名,参数mode字符串则代表着流形态。
mode有下列几种形态字符串:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
上 述的形态字符串都可以再加一个b字符,如rb、w+b或ab+等组合,加入b字符用来告诉函数库打开的文件为二进制文件,而非纯文字文件。不过在POSIX系统,包含Linux都会忽略该字符。由fopen()所建立的新文件会具有S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH(0666)权限,此文件权限也会参考umask值。
返回值
文件顺利打开后,指向该流的文件指针就会被返回。若果文件打开失败则返回NULL,并把错误代码存在errno 中。
附加说明
一般而言,开文件后会作一些文件读取或写入的动作,若开文件失败,接下来的读写动作也无法顺利进行,所以在fopen()后请作错误判断及处理。


fwritefread是以记录为单位的I/O函数, freadfwrite函数一般用于二进制文件的输入输出。

#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
指定的值。下面的例子由两个程序组成,一个程序把结构体保存到文件中,另一个程序和从文件中读出结构体

freadfwrite的例子程序如下:


#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;

}
#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

fwritefread的应用举例:

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函数检验数据是否写入文件。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值