linux open fopen popen函数区别

open 函数(打开一个文件)


与 read, write 等配合使用
1.1包含头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

1.2函数原型
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);

open函数返回一个文件描述符,一个小的非负整数,后面操作这个文件时就用这个文件描述符。

1.3函数参数讲解
int open(const char *pathname, int flags);

const char *pathname :路径名,是一个字符串
       int flags:
             O_RDONLY   1 只读打开
             O_WRONLY   2 只写打开
             O_RDWR    4 读写打开

如果open打开一个文件的时候,没有该文件,那么应该使用一下函数
int open(const char *pathname, int flags, mode_t mode);

示例
open("./file",O_RDWR|O_CREAT,0600);
如果没有file文件,加上(|O_CREAT),创建文件,并且给文件权限,第三个参数就是权限,这里我们系=写0600,为可读可写。

例如:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <errno.h>


int main()
{
        int fd;//文件描述符,int类型
        fd = open("./file",O_RDWR);

        if(fd = -1) //文件创建成功,返回非负整数
        {
                perror("why:");//打印出错原因
                fd = open("./file",O_RDWR|O_CREAT,0600);//如果没有该文件,创建文件并且权限为0600(可读可写);
                if(fd > 0)
                {
                        printf("file creat successful,fd=%d \n",fd);
                }
        }

        return 0;
}

write函数
函数原型:ssize_t write(int fd,const void* buf,size_t count);

函数说明:write()会把参数buf所指向的内存写入count个字节放到参数所指向的文件里。如果成功写入会返回实际写入的字节数,当有错误发生时则返回-1,错误代码存放在error中。

参数解释:

fd:是文件描述符,write所对应的是写,即就是1号文件描述符(对应标准输出)
buf:通常是一个字符串,需要写入的字符串
count:每次写入的字节数
说明:write函数返回值一般无0,只有当如下情况发生时才会返回0:write(fd,p1+len,(strlen(p1)-len))中第三个参数为0,此时write函数说明也不做,只返回0.write函数从buf写数据到fd中,若buf中数据无法一次性读完,那么第二次读buf中的数据时,其读指针位置,即第二个参数buf不会自动移动,需要程序员编程控制。但并不是简单的将buf首地址填入第二个参数,可以按如下格式实现读位置移动:write(fd,p1+len,(strlen(p1)-len)),这样write第二次循环时就会从p1+len处写数据到fd,后面以此类推,直至strlen(p1)-len的值变为0.

 

read函数

函数原型:ssize_t read(int fd ,void *buf, size_t count);

函数说明:read函数会把参数fd所指的文件传送count个字节到buf指针所指的内存中。返回值为实际读取到的字节数,如果返回0表示已经到达文件末尾或是无可读取的数据。若参数count为0,则read函数不会有作用并返回0.

参数解释:

fd:是文件描述符
buf:为读出数据的缓冲区
count:为每次读取的字节数(是请求读取的字节数,读上来的数据保 存在缓冲区buf中,同时文件的当前读写位置向后移)
注意:read函数参数中fd所指向的文件中的数据如果小于要读取的数据就会引起阻塞。

   #include<stdio.h>
   #include<sys/stat.h>
   #include<sys/types.h>
   #include<fcntl.h>
   #include<string.h>
   #include<unistd.h>
   
   int main()
   {
     umask(0);
    int fd = open("myfile",O_WRONLY|O_CREAT,0644);
    if(fd < 0)
     {
         perror("open");
         return 1;
     }
     const char *msg = "hello world";
     write(fd,msg,strlen(msg));//将msg指针指向的内容写进fd文件描述符所对应的文件中,即写进myfile中
     char buf[1024];
     ssize_t s = read(fd,buf,strlen(msg)); //将fd所指向的文件中的内容读进buf所指向的内存中                                         
     if(s > 0)
     {
         printf("%s",buf);
    }
    return 0;
}
 
 
 

fopen函数
与 fread, fwrite等配合使用。


1.1包含头文件
include <stdio.h>

1.2函数原型
FILE *fopen(const char *pathname, const char *mode);
fopen函数返回一个文件指针。

1.3函数参数讲解
filename :文件名称
mode 打开模式:
r   只读方式打开一个文本文件
w   只写方式打开一个文本文件
r+   可读可写方式打开一个文本文件
w+   可读可写方式创建一个文本文件

fread和fwrite函数
size_t fread(void *buf, size_t size, size_t count, FILE *fp);

size_t fwrite(const void * buf, size_t size, size_t count, FILE *fp);

ptr为指向缓冲区保存或读取的数据。
size为控制记录大小。
nmemb为记录数。
fp函数返回读取或回写的记录数。


即 fread 函数从文件 fp 中读出“size*count”个字节保存到 buf 中,而 fwrite 把 buf 中的“size*count”个字节写到文件 fp 中。最后,函数 fread 和 fwrite 的返回值为读或写的记录数,成功时返回的记录数等于 count 参数,出错或读到文件末尾时返回的记录数小于 count,也可能返回 0。需要注意的是,尽管 fread 和 fwrite 函数可以对数据进行成块读写,但并不是说一次想读写多少数据就能全部读写多少数据,毕竟缓存有限,而且不同的操作系统的缓存大小也可能不一样。

用法差异
效率:fread为封装好的库函数,而read为系统函数,一般来说,fread效率更高。
读取文件差别:fread功能更强大,可以的结构体的二进制文件。如果底层的操作,用到文件描述符,用read更好。
 

popen函数(与system函数类似)

popen函数可以获取系统指令执行的输出结果。
system函数直接在终端执行指令 ,数据会流失。

函数原型

FILE *popen(const char *command, const char *type);
参数const char *command要使用的命令
参数type可使用“r”代表读取,“w”代表写入。
例如:

#include <stdio.h>


int main()
{
        char ret[1024] = {'\0'};
        FILE *fp;
        int n_read=0;
        fp = popen("ps","r");
        n_read = fread(ret,1,1024,fp);
        printf("n_read = %d ret =\n %s \n",n_read,ret);

        return 0;
}

popen函数会将指令执行结果会流到 popen函数开辟的管道fp里面去,后面就可以用fread,fwrite函数对执行结果进行操作。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值