1.10标准C库文件操作

标准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库打开创建文件读写文件光标移动

1.10标准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;
}

1.10标准C库文件操作
总结: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;
}

1.10标准C库文件操作
操作效果与前者的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;
}

1.10标准C库文件操作

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;
}

判断如果没到达文件尾巴,就读取文件里的字符,直至到达文件尾巴,跳出循环

上一篇:随笔4——fopen与fopen_s用法


下一篇:多态的分类和简单介绍,fopen读写