标准C库文件操作
open与fopen的区别
a.来源性
open是UNIX系统调用函数(包括Linux),返回的是文件描述符
fopen是标准C语言库,在不同的系统中调用不同的API,
b.移植性
fopen具有良好的移植性,open移植性有限,例如:fopen在Windows系统下运行,而open只能使用Windows系统下类似的功能API函数“CreatFile”
c.适用范围
open在UNIX下,一切设备都是以文件的操作形式。基于Linux内核的文件操作
fopen适用于普通正规文件
d.缓冲
缓存文件系统:内存“缓冲区”越大,则操作外存的次数越少,执行速度越快,效率越高。(fopen,fwrite,fput,fget…)
使用fopen函数,由于在用户态下就有了缓冲,因此进行文件读写操作的时候就减少了用户态和内核态的切换(切换到内核态还需要调用系统调用API:read, write)。
使用open函数,在文件读写时则每次都需要进行内核态和用户态的切换,如果按顺序访问文件,fopen系列的函数要比直接调用open系列的函数快: 如果随机访问文件则相反。
标准c库打开创建文件读写文件光标移动
函数原型:size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
(1)buffer:缓存区
(2)size:要写入内容的单字节数
(3)count:要进行写入size字节的数据项的个数
(4)stream:目标文件指针
函数原型: size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
两者函数同理
标准C库打开创建文件、读写文件、光标移动
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fd;
char *src ="hello world";
char readBuf[128] = {'0'};
fd = fopen("./six.txt","w+");
int n_write = fwrite(src,sizeof(char)*strlen(src),1,fd);
fseek(fd,0,SEEK_SET);
int n_read = fread(readBuf,sizeof(char)*strlen(src),100,fd);
printf("read: %s\n",readBuf);
printf("write = %d,read = %d\n",n_write,n_read);
fclose(fd);
return 0;
}
总结:fwrite 与 fread的返回值是参照第三个变量
区别在于:fwrite的第三个参数是多少,那么就会向文件中写入多少次;fread的第三个参数不仅仅是根据自身的数值进行返回,还有根据读取的有效次数进行返回
标准库写入结构体文件
#include <stdio.h>
#include <string.h>
struct Test
{
int a;
char c;
};
int main()
{
FILE *fd;
struct Test data1[2] ={{22,'q'},{26,'w'}};
struct Test data2[2];
fd = fopen("./file1","w+");
fwrite(&data1,sizeof(struct Test)*2,1,fd);
fseek(fd,0,SEEK_SET);
fread(&data2,sizeof(struct Test)*2,1,fd);
printf("read:%d %c\n",data2[0].a,data2[0].c);
printf("read:%d %c\n",data2[1].a,data2[1].c);
fclose(fd);
return 0;
}
操作效果与前者的open、write,read相同,用法类似
fputc函数
作用:写入一个字符到文件
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
int i;
char *src = "wahaha";
int len = strlen(src);
fp = fopen("./six.txt","w+");
for(i=0;i<len;i++){
putc(*src,fp);
src++;
}
fclose(fp);
return 0;
}
feof与fgetc函数
feof作用:是否到达文件尾巴
返回值如果是0,表示到达文件尾巴:如果非0,则没有达到文件尾巴
fgetc作用:读取文件字符串
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp;
char c;
fp = fopen("./six.txt","r");
while(!feof(fp)){
c = fgetc(fp);
printf("%c",c);
}
fclose(fp);
return 0;
}
判断如果没到达文件尾巴,就读取文件里的字符,直至到达文件尾巴,跳出循环