这几个函数的区别: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_CUR、 SEEK_END 或 SEEK_SET
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
其中SEEK_SET,SEEK_CUR和SEEK_END和依次为0,1和2.
返回值:成功返回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:文件指针
返回值:成功:返回非负数失败:返回EOFfgetc函数原型: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型,-1与0XFF相等,会发生冲突
返回值: 若成功,则返回读取的“字节”,同于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 函数用法