常用:fopen,fseek,fwrite,fread,feof,fclose
其他:fputc,fgetc
标准c库的fopen和open的区别:
具体可参考:https://www.cnblogs.com/NickyYe/p/5497659.html
1.
open:UNIX系统调用函数(包括LINUX等),返回的是文件描述符(File Descriptor),它是文件在文件描述符表里的索引。
fopen:ANSIC标准中的C语言库函数,在不同的系统中应该调用不同的内核api。返回的是一个指向文件结构的指针。
2.open应用于UNIX系统,因此有一定的局限性,fopen源于标准c库,用c语言编写的代码环境下都能用,移植性好
3.open返回文件描述符,而文件描述符是UNIX系统下的一个重要概念,UNIX下的一切设备都是以文件的形式操作。如网络套接字、硬件设备等。当然包括操作普通正规文件(Regular File)。
fopen是用来操纵普通正规文件(Regular File)的。
4.如果从文件IO的角度来看,前者属于低级IO函数,后者属于高级IO函数。低级和高级的简单区分标准是:谁离系统内核更近。低级文件IO运行在内核态,高级文件IO运行在用户态。
5.fopen有缓冲区,能在缓冲区中完成相应操作能更少依赖内核和用户的切换,open通过类似于指令的方式与内核进行对话操作文件速度有一定影响
fopen
原型:FILE *fopen(const char *filename, const char *mode);
const char *filename 参数 : 文件名 ;
const char *mode 参数 : 文件的打开方式 ;
文件打开方式的参数:
"r" 打开文字文件只读
"w" 创建文字文件只写
"a" 增补, 如果文件不存在则创建一个
"r+" 打开一个文字文件读/写
"w+" 创建一个文字文件读/写
"a+" 打开或创建一个文件增补
"b" 二进制文件(可以和上面每一项合用)
"t" 文这文件(默认项)
示例代码
#include <stdio.h>
#include <string.h>
int main()
{
FILE *p = fopen("./frAw.txt","w+");
printf("open success!\n");
return 0;
}
fseek
和lseek的用法一样
off_t lseek(int fd, off_t offset, int whence);
参数介绍:
fd为文件的对应值
offset为偏移量
whence可以选择:SEEK_SET(光标回到行首),SEEK_CUR(光标在当前下标),SEEK_END(光标到行末)
fread
函数原型:
size_t
fread
(
void
*buffer,
size_t
size,
size_t
count,
FILE
*stream );
void *buffer : 将文件中的二进制数据读取到该缓冲区中 ;
size_t size 参数 : 读取的 基本单元 字节大小 , 单位是字节 , 一般是 buffer 缓冲的单位大小 ;
- 如果 buffer 缓冲区是 char 数组 , 则该参数的值是 sizeof(char) ;
- 如果 buffer 缓冲区是 int 数组 , 则该参数的值是 sizeof(int) ;
size_t count 参数 : 读取的次数
FILE *stream 参数 : 文件的指针
size_t 返回值 : 读取的次数
fwrite
函数原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
参数说明:
const void *ptr : 读出数据存放的地方
size_t size : 要写出数据的 基本单元 的字节大小 , 写出单位的大小 ;
size_t nmemb : 要写出数据的读出次数;
FILE *stream : 要读的文件的指针;
返回值 : size_t 返回值返回的是读出次数
示例代码
将字符串写入文件,并从文件读出字符串
#include <stdio.h>
#include <string.h>
int main()
{
char *str="xwd yyds!";
char buf[64]={0};
FILE *p = fopen("./frAw.txt","w+");
fwrite(str,sizeof(char),strlen(str),p);
fseek(p,0,SEEK_SET);
fread(buf,sizeof(char),strlen(str),p);
printf("read info:%s\n",buf);
return 0;
}
同时不仅能写入读出字符串还能写入读出其他的内容,下面以结构体为例
示例代码
#include <stdio.h>
#include <string.h>
struct Student{
char name[15];
int age;
};
int main()
{
struct Student s1={"xiaoming",18};
struct Student s2;
FILE *p = fopen("./frAw2.txt","w+");
fwrite(&s1,sizeof(struct Student),1,p);
fseek(p,0,SEEK_SET);
fread(&s2,sizeof(struct Student),1,p);
printf("s2 info:%s,%d",s2.name,s2.age);
fclose(p);
return 0;
}
执行成功后查看文件内容可能会出现乱码,因为文本以字符串方式记载
feof
函数原型:int feof ( FILE * stream );
FILE * stream :文件指针
功能:判断是文件内容是否结束(结尾)
结束前返回0,内容结束后面没内容,返回1
fputc
函数原型:int fputc(int char, FILE *stream)
int char :字符
参数FILE *stream :文件的指针
一般通过指针移动写入文件的内容
示例代码
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp = fopen("./fputc.txt","w+");
char *str = "xwd yyds!!";
int i;
int len = strlen(str);
for(i=0;i<len;i++)
{
fputc(*str,fp);
str++;
}
fclose(fp);
return 0;
}
fgetc
函数原型:int fgetc(FILE *stream)
参数FILE *stream :文件的指针
一般通过指针移动获取文件的内容
示例代码
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp = fopen("./fputc.txt","r");
char c;
while(!feof(fp))
{
c = fgetc(fp);
printf("%c",c);
}
fclose(fp);
return 0;
}