fopen fwrite fread fclose ...
属于标准
C
库
include <stdio.h> standard io lib
open close write read ... 属于Linux系统调用
可移植性与缓存:
fopen
强过于
open ...
fopen用户态有缓存,而open用户态无缓存...
运行图示:

1、fopen()
函数原型:FILE * fopen(constchar *path , cost char *mode)
/** @description : 打开一个文件* @param ‐ path : 指定文件路径 , 如: "./test.txt"* @param ‐ mode :指定文件的打开方式,如下图:* @return : 成功,返回指向该文件的文件指针 ; 若失败,返回 NULL*/参数说明 :第一个参数为欲打开文件的文件路径及文件名 eg:"mm",第二个参数表示对文件的打开方式 eg "r" 或 "w" 或 "r+"...注:mode有以下值 :r: 只读方式打开,文件必须存在r+ :可读写,文件必须存在rb+ :打开二进制文件,可以读写rt+: 打开文本文件,可读写w: 只写,文件存在则文件长度清 0 ,文件不存在则建立该文件w+ : 可读写,文件存在则文件长度清 0 ,文件不存在则建立该文件a: 附加方式打开只写,不存在建立该文件,存在写入的数据加到文件尾, EOF 符保留a+ :附加方式打开可读写,不存在建立该文件,存在写入的数据加到文件尾, EOF 符不保留wb :打开二进制文件,只写 wb+: 打开或建立二进制文件,可读写wt+: 打开或建立文本文件,可读写at+: 打开文本文件,可读写,写的数据加在文本末尾 ab+: 打开二进制文件,可读写,写的数据加在文件末尾常用的有:r r+ w w+ ( 切记 :有关 "r" 的mode必要要求文件存在才可以操作)
2、fclose()
函数原型:int fclose(FILE* stream);
@return : 成功,返回0; 若失败,返回EOF
fclose与fopen联合代码:
#include <stdio.h>
#include <string.h>
int main(){
FILE *flag=NULL;
int ntd;
flag=fopen("/home/lhy/fmm","w");//打开文件fww ,若文件不存在,则创立
if(flag==NULL){
printf("open failed!\n");
return -1;
}
printf("open sussend!\n");
ntd=fclose(flag);
if(ntd){
printf("close failed!\n");
return -1;
}
printf("close sussend=%d!\n",ntd);//关闭成功,返回成功的值为0;
return 0;
}
3、fread()
函数原型 :size_t fread(void* buff , size_t size, size_t count , FILE* stream)参数:@第一个参数为接收数据的指针 (buffff), 也即数据存储的地址;@第二个参数为单个元素的大小,即由指针写入地址的数据大小,注意单位是字节;@第三个参数为元素个数,即要读取多少个数据大小为 size 的元素的个数;@第四个参数为提供数据的文件指针,该指针指向文件内部数据;返回值:读取的总数据元素个数;
#include <stdio.h>
#include <string.h>
int main(){
FILE *flag=NULL;
int ntd;
char readbuff[12];char readbuff[12]={0};
memset(readbuff,0,12);//初始化数组整体为0
flag=fopen("/home/lhy/fmm","r+");//上一个代码已经w创立了,于是这里便r+直接读写就行了
if(flag==NULL){
printf("open failed!\n");
return -1;
}
printf("open sussend!\n");
ntd=fread(&readbuff,4,2,flag);//size为4,表示4个字节,count为2表示2个size,于是一共8字节
if(ntd<=0){
printf("read failed!\n");
}
printf("have readed = %s\n",readbuff);//读取fmm文件的内容,存在入readbuff数组,再打印出来
ntd=fclose(flag);
if(ntd){
printf("close failed!\n");
return -1;
}
printf("close sussend=%d!\n",ntd);//关闭成功,返回成功的值为0;
return 0;
}
4、fwrite()
函数原型:int fwrite(void* buffer,int size,int count,FILE* fp);
@参数类型与功能同上fread();
@return : 返回实际写入的数据项的个数
fwrite与fread归纳:
fread() ── 从 fp 所指向文件的当前位置开始,一次读入 size 个字节,重复 count 次,并将读入的数据存放, 到从 buffffer 开始的内存中; buffffer 是存放读入数据的起始地址(即存放何处)eg:&readbuff表示起始。fwrite() ── 从 buffffer 开始,一次输出 size 个字节,重复 count 次,并将输出的数据存放到 fp 所指向的文件中。 buffffer是要输出数据在 内存中的起始地址(即从何处开始输出)eg:&writebuff表示起始。
#include <stdio.h>
#include <string.h>
//FILE *fopen(const char *pathname, const char *mode);
//int fclose(FILE *stream);
//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);
//int fseek(FILE *stream, long offset, int whence);
int main()
{
int i,j;
FILE *flag=NULL;
int ntd;
char readbuff[12];//char readbuff[12]={0};用这个就可以不用memset()
char *writebuff="hello world";
memset(readbuff,0,12);
flag=fopen("/home/lhy/fmm","r+");
if(flag==NULL){
printf("open failed!\n");
return -1;
}
printf("open sussend!\n");
ntd=fread(&readbuff,4,2,flag);
if(ntd<=0){
printf("read failed!\n");
}
printf("have readed = %s\n",readbuff);
ntd=fwrite(writebuff,4,1,flag);//failed is open() not use "r+"
if(ntd<=0){
printf("write failed\n");
return -1;
}
printf("have writed %d\n",ntd);//返回1,这里的返回值为count参数
ntd=fclose(flag);
if(ntd){
printf("close failed!\n");
return -1;
}
printf("close sussend=%d!\n",ntd);//关闭成功返回0
return 0;
}
5、fseek()
函数类型:int fseek(FILE *stream,long offset,int framewhere);
参数:@第一个为文件指针,@第二个是指针的偏移量,@第三个是指针偏移起始位置@返回值:重定位成功返回 0 ,否则返回非零值@ 需要注意 的是该函数不是重定位文件指针,而是重定位文件内部的指针,让指向文件内部数据的指针移到文件中我 们感兴趣的数据上,重定位主要是这个目的。3个宏:SEEK_SET 既 0 文件开头SEEK_CUR 既 1 文件当前位置SEEK_END 既 2 文件结尾但不推荐用数字 最好用宏例子:1. fseek(fp,100L,SEEK_SET); 把 fp 指针移动到离文件开头 100 字节处;2. fseek(fp,100L,SEEK_CUR); 把 fp 指针移动到离文件当前位置 100 字节处;3. fseek(fp,100L,SEEK_END); 把 fp 指针退回到离文件结尾 100 字节处。
#include <stdio.h>
#include <string.h>
//FILE *fopen(const char *pathname, const char *mode);
//int fclose(FILE *stream);
//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);
//int fseek(FILE *stream, long offset, int whence);
int main()
{
FILE *flag=NULL;
int ntd;
char readbuff[12];//char readbuff[12]={0};
char *writebuff="hello world";
memset(readbuff,0,12);
flag=fopen("/home/lhy/fmm","r+");
if(flag==NULL)
{
printf("open failed!\n");
return -1;
}
printf("open sussend!\n");
ntd=fread(&readbuff,4,2,flag);
if(ntd<=0)
{
printf("read failed!\n");
}
printf("have readed = %s\n",readbuff);
ntd=fseek(flag,1,SEEK_SET);//偏移起始位置1
if(ntd){
printf("fseek failed!\n");
return -1;
}
printf("fseek succend!\n"); //fseek成功返回0
ntd=fwrite(writebuff,4,1,flag);
if(ntd<=0){
printf("write failed\n");
return -1;
}
printf("have writed %d\n",ntd);
ntd=fclose(flag);
if(ntd){
printf("close failed!\n");
return -1;
}
printf("close sussend=%d!\n",ntd);//关闭成功返回0
return 0;
}
额~好像成功的英语拼写是succeed,printf里面一直都拼写错了,请原谅我英语烂(偷笑)