赞
踩
这几个函数的区别: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:文件指针 返回值: 成功:返回非负数 失败:返回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型,-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 函数用法
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。