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函数对执行结果进行操作。