linux下的IO详解(fopen 和 open ,fread 和 read ,fwrite 和 write)

上一篇linux下的IO 函数经常使用(一),fopen 和 open讲述了fopen和open的区别,那接下来配合使用的读写操作

linux下的IO 函数经常使用(二),fread,fwrite 和 read,write
  1. fread和fwrite
    属于ANSI标准C的I/O库函数,原型如下:
    #include 
       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
       size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);
    
    

size - 指定每个数据结构的长度;
nmemb - 给出要传输的记录个数。

返回值表示成功读写的字节数。
下面举一个标准C输入输出的案例吧如下:

#include
#include
int main(void)
{
        char readBuff[1024*2];
        //通过只读方式打开一个path为readtext.c的文件,返回文件流file_read
        FILE* file_read = fopen("readtext.c","r");
          //通过写的方式打开一个path为readtext1.c的文件,返回文件流file_write
        FILE* file_write = fopen("readtext1.c","w");
        if(file_read && file_write)
        {
                printf("获取到file1\n");
                //从file_read流中读取数据到readBuff中
                int size_r = fread(readBuff,sizeof(readBuff),1,file_read);
                printf("读取到的数据是:\n%s\n",readBuff);
                //将readBuff中数据写入file_write流中
                fwrite(readBuff,strlen(readBuff),1,file_write);
                printf("readtext1.c code :\n%s\n ",readBuff);
        }
        fclose(file_read);
        fclose(file_write);
        fprintf(stdout,"标准输出流输出:\n%s\n",readBuff);
        return 0;
}

上述代码其实就是实现了,copy readtext.c中内容 到一个名为readtext1.c的文件中,如果readtext1.c不存在测创建该文件,并且拷贝数据,最后将拷贝的数据打印到终端。

  1. read和write
    属于GLIBC的I/O库函数,原型如下:

       #include 
       ssize_t write(int fd, const void *buf, size_t count);
       ssize_t read(int fd, void *buf, size_t count);

fd:通过open打开的文件描述符
buf:自定义缓冲
count:一次(写入/获取)总字节
返回:
成功 返回读/写 总字节
失败 返回 -1
具体错误信息再errno这个全局变量中,通过 char *strerror(int errnum) 查看详细信息。

#include
#include
#include
#include
#include
#include
#include


#define BUFF_SIZE (1024 * 2)

int main(void)
{
        char readBuff[BUFF_SIZE];

        int fd_r = open("readtext.c",O_RDONLY|O_CREAT);
        int fd_w = open("readtext1.c",O_RDWR|O_TRUNC|O_CREAT);
        if(fd_r < 0 || fd_w < 0)
        {
                fprintf(stderr, "fopen failed, reason: %s. \nexit.\n",strerror(errno));
                return -1;;
        }
        size_t read_lens = read(fd_r,readBuff,BUFF_SIZE);
        size_t write_lens = write(fd_w,readBuff,read_lens);
        fprintf(stdout,"标准输出流输出:\n%s\n",readBuff);
        return 0;
}

俩个案例实现的结果一样都会拷贝复制的作用

俩种用法之间的区别:

在linux系统下标准C库下的I/O读写函数实际上就是对linux的系统调用 进行了一次封装 ,因为是标准C库,所以在不同的系统下调用不同的内核API,并且操作的是一个文件流
在底层IO 向内核高速页缓存读写数据之前自己多添加了一块缓冲流,
缓冲文件系统的特点是:在用户空间内存开辟一个“缓冲区”,为程序中的每个需要读写的文件使用,
当执行读操作时,优先判断是否在用户空间的“缓冲区”有所需数据,如果没有则从内核态高速页缓存中读取, 装满后再从 内存“缓冲区”依此读入接收的变量。
执行写文件的操作时, 先将数据写入内存“缓冲区”,待内存“缓冲区”装满后再写入文件。 由此可以看出,内存 “缓冲区”的大小,影响着用户态到内核态之间的切换,从而影响着程序运行的性能。
内存“缓冲区”越大,则用户态和内核态切换的次数就少,执行速度就快、效率高。
一般来说,文件“缓冲区”的大小随机器 而定。
fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
linux系统下GLIBC库的I/O读写函数操作的是文件描述符,文件描述符是linux下的一个概念,linux下的一切设备都是以文件的形式操作.如网络套接字、硬件设备等。当然包括操作文件。
fopen是标准c函数。返回文件流而不是linux下文件句柄。只能在linux下使用该库函数

你可能感兴趣的:(技术博客)