一、fopen与open的区别
1、来源不同:
open是unix系统调用函数(包括Linux),返回的是文件描述符,它是文件描述符表里的索引。
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调不同的内核api,返回的是一个指向文件结构的指针。
2、移植性:
从来源看,fopen是C标准函数,因此拥有良好的移植性,而open是unix系统调用,移植性有限,如windows下相似的功能使用api函数CreatFile。
3、使用范围
open返回文件描述符,而文件描述符是unnix系统下的重要概念,unix下的一切设备都是文件的形式操作,如网络套接字、硬件设备等、当然包括操作普通正规文件(Regular File)
Fopen是从来操纵普通正规文件(Regular File)的
4、 文件IO层次
如果从文件IO的角度来看,open属于低级IO函数,fopen属于高级IO函数,低级和高级的简单区分标准是:谁离系统内核更近,低级文件IO运行在内核态、高级文件IO运行在用户态。
5、 缓冲区
open没缓冲区,fopen有缓冲区
缓冲文件系统:fopen是在缓冲区中进行文件操作的。
非缓冲文件系统:open是通过系统调用,在内核中进行文件操作的。
二、fopen的使用
FILE *fp;
FILE *fopen(const char *path, const char *mode);
const char *path:要打开的文件名
const char *mode:打开文件的权限
pf = fopen("/file.txt","w+"); 举例说明
"w+":一定要加双引号。
fopen的打开方式:
mode打开模式:r : 只读方式打开一个文本文件
w:只写方式打开一个文本文件
r+:可读可写方式打开一个文本文件
w+:可读可写方式创建一个文本文件
三、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:写入到哪个文件
举例:
char *str = "my name is Chian!";
fwrite(str,sizeof(char),strlen(str),fp);//一次写一个字符,写这么多次
fwrite(str,sizeof(char)*strlen(str),1,fp);//一次写这么多个字符,写一次
四、fread的使用
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
void *ptr:一个读取数据的缓存区
size_t size:一个字符的大小
size_t nmemb:一共读取多少个字符
FILE *stream:从哪个文件读
五、fseek的使用
int fseek(FILE *stream, long offset, int whence);
FILE *stream: 指要操作文件的文件描述符
long offset: 指光标的偏移值
int whence: 指定位光标的位置
举例代码:
#include <stdio.h>
#include <string.h>
int main(){
FILE *fd;
char *str = "this is boy";
char readBuf[128] = {0};
// FILE *fopen(const char *path, const char *mode);
fd = fopen("./file3","w+"); //打开文件
//size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//fwrite(str,sizeof(char),strlen(str),fp);
fwrite(str,sizeof(char)*strlen(str),1,fd); //把数据写到文件中
fseek(fd,0,SEEK_SET); //移动光标到文件开头
fread(readBuf,sizeof(char),strlen(str),fd); //读取刚才写的文件数据
printf("read data :%s\n",readBuf);
fclose(fd);
return 0;
}
执行结果:
六、写入结构体到文件
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
struct Test{
int a;
char b;
};
int main(){
FILE *fd;
struct Test data = {100,'h'};
struct Test data2;
fd = fopen("./file1","w+");
int n_write = fwrite(&data,sizeof(struct Test),1,fd);
fseek(fd,0,SEEK_SET);
int n_read = fread(&data2,sizeof(struct Test),1,fd);
printf("read data :%d,%c\n",data.a,data.b);
fclose(fd);
return 0;
}
执行结果:
七、fputc的使用
int fputc(int c , FILE *stream); 写一个字符到文件中
#include <stdio.h>
#include <string.h>
int main(){
FILE *fp;
fp = fopen("./test.txt","w+");
fputc('a',fp); //写一个字符到文件中
fclose(fp);
return 0;
}