fread、fwrite、fopen函数的简单使用和open、read、write区别解析

这几个函数的区别:fread、fwrite、fopen和open、read、write区别解析

标准C库函数的简单使用

fopen函数原型:

#include <stdio.h>
FILE *fopen(const char *pathname, const char *mode);

第一个参数是:要打开的文件路径
第二个参数是:以什么权限打开
文件顺利打开后,指向该流的 文件指针(FILE*) 就会被返回。如果文件打开失败则返回NULL,并把错误代码存在errno 中。
mode打开模式(注意双引号):
“r”  以只读方式打开文件,该文件必须存在。

“r+” 以可读写方式打开文件,该文件必须存在。

”rb+“ 读写打开一个 二进制文件,允许读写数据(可以任意修改),文件必须存在。

“w”   打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。

“w+”  打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。

“a”   以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。(
EOF符保留)

”a+“  以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
(原来的EOF符不保留)

“wb”  只写打开或新建一个 二进制文件;只允许写数据(若文件存在则文件长度清为零,即该文件内容会消失)

“wb+” 读写打开或建立一个二进制文件,允许读和写(若文件存在则文件长度清为零,即该文件内容会消失)

fwrite函数:

#include <stdio.h>
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);


ptr:是一个指向用于保存数据的内存位置的指针
       (是一个指针,对于fwrite来说,是要获取数据的地址)
size:   是每次读取的字节数
nmemb:  是读取的次数
stream: 是数据写入的流(目标指针的文件)
返回值:
成功,该函数返回一个 size_t 对象,表示元素的总数(其实就是nmemb),该对象是一个整型数据类型。如果该数字与 nmemb 参数不同,则会显示一个错误。
失败:返回0
是实际写入的元素(并非字节)数目
ps:如果输入过程中遇到了文件尾或者输出过程中出现了失误,这个数字可能比请求的元素数目要小

fread函数:

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

buffer:  是读取的数据存放的内存的指针,
        (可以是数组,也可以是新开辟的空间)
    ps:   是一个指向用于保存数据的内存位置的指针(为指向缓冲区
          保存或读取的数据或者是用于接收数据的内存地址)
size:   是每次读取的字节数
nmemb:  是读取的次数
stream:  是要读取的文件的指针
      ps: 是数据读取的流(输入流)

返回值:
成功:是实际读取的元素(并非字节)数目,当目标缓冲区是20字节时,而读100次,返回的是实际读到有字节的次数。
失败:返回0
ps:如果输入过程中遇到了文件尾或者输出过程中出现了错误,这个数字可能比请求的元素数目要小

fseek函数:

int fseek( FILE *stream, long offset, int origin );
第一个参数stream为文件指针
第二个参数offset为偏移量,整数表示正向偏移,负数表示负向偏移
第三个参数origin设定从文件的哪里开始偏移,可能取值为:SEEK_CURSEEK_ENDSEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CURSEEK_END和依次为012.
返回值:成功返回0,失败返回非0.

代码的综合:

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
        FILE *fp;//定义文件指针
        char* buf="ffffff";
        char* readbuf=NULL;
        readbuf=(char*)malloc(strlen(buf));
        int n_write;
        int n_read;
        fp=fopen("./filetest","w+");
        if(fp==NULL){
                printf("文件打开失败\n");
                perror("fopen");
                exit(0);
        }
        n_write=fwrite(buf,sizeof(char),strlen(buf),fp);
        if(n_write==0){
                printf("写入失败\n");
                perror("fwrite");
                exit(0);
        }
        fseek(fp,0,0);
        n_read=fread(readbuf,sizeof(char),strlen(buf),fp);
        if(n_read==0){
                printf("读取失败\n");
                perror("fread");
                exit(0);
        }
        fseek(fp,0,0);
        n_read=fread(readbuf,sizeof(char),strlen(buf),fp);
        if(n_read==0){
                printf("读取失败\n");
                perror("fread");
                exit(0);
        }
        printf("写入:%d个,读出:%d个,内容为:%s\n",n_write,n_read,readbuf);
        fclose(fp);
        return 0;
}

fputc、fputs、feof、fgetc、fgets函数:

int fputc(int c, FILE *stream);
参数:
    c:字符
    fp:文件指针
返回值:
    成功:返回写入的字符
    失败:返回EOF
int fputs(const char *s, FILE *stream);
参数:
    s:字符串
    fp:文件指针
返回值:
    成功:返回非负数
    失败:返回EOF

fgetc函数原型:int fgetc(FILE *stream);从文件fp中读入一个字节,指针自动后移

为什么fgetc返回的是int而不是char?
通过man fgetc查看其返回值:fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.
返回时,unchar型会被转换为int,因为读到文件尾时需要返回的是EOF-1, 如果为char型,-10XFF相等,会发生冲突
返回值: 若成功,则返回读取的“字节”,同于fputc函数的 ch,到达文件尾,返回EOF结束

函数原型char * fgets(char *str,int n,FILE *fp)从文件中每次读入一行。
str是存放将要读入字符型数据的存放地址
n是数目变量
fp是文件指针
该函数表明从文件fp中读入n-1个字符放在以str为起始地址的空间
因为系统会在最后加上一个‘\0’。

读入过程中:
若该行字符数不超过n-2(2代表该行本身的换行符‘\n’和系统自动加上的'\0')
则函数读完该行就结束,文件指针移动到下一行,再进行文件读入操作时,从下一行开始读入。

若该行字符数目总数(不包含换行符)大于n-2,则只读入n-1个字符(1代表系统自己加上的'\0')
文件指针自动移动到下一个字符处,再进行文件读入操作时,顺序读入该行剩下的字符。

返回值:
文件读入成功则返回str,失败或者读到文件尾则返回null。

feof 函数原型:int feof(FILE *stream);
feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0

大佬博客:fgets 函数用法

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值