一.open
1.open
Open是unix系统调用函数(包括Linux),返回的是文件描述符,它是文件描述符表里的索引。
open返回文件描述符,而文件描述符是unnix系统下的重要概念,unix下的一切设备都是文件的形式操作,如网络套接字、硬件设备等、当然包括操作普通正规文件(Regular File)。
如果从文件IO的角度来看,open属于低级IO函数,fopen属于高级IO函数,低级和高级的简单区分标准是:谁离系统内核更近,低级文件IO运行在内核态、高级文件IO运行在用户态。
open没缓冲区,open是通过系统调用,在内核中进行文件操作的。
对应函数为writ,read,close等。
2.open函数的使用
#include <fcntl.h>
int open(const char *pathname, int oflag, … /* mode_t mode */);
返回值:成功则返回文件描述符,否则返回 -1
对于 open 函数来说,第三个参数(…)仅当创建新文件时(即 使用了O_CREAT 时)才使用,用于指定文件的访问权限位(access permission bits)。pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp);oflag 用于指定文件的打开/创建模式,这个参数可由以下常量(定义于 fcntl.h)通过逻辑或构成。
O_RDONLY 只读模式
O_WRONLY 只写模式
O_RDWR 读写模式
打开/创建文件时,至少得使用上述三个常量中的一个。以下常量是选用的:
O_APPEND 每次写操作都写入文件的末尾
O_CREAT 如果指定文件不存在,则创建这个文件
O_EXCL 如果要创建的文件已存在,则返回 -1,并且修改 errno 的值
O_TRUNC 如果文件存在,并且以只写/读写方式打开,则清空文件全部内容(即将其长度截短为0)
O_NOCTTY 如果路径名指向终端设备,不要把这个设备用作控制终端。
O_NONBLOCK 如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O
二.fopen
1.fopen
fopen是ANSIC标准中的C语言库函数,在不同的系统中应该调不同的内核api,返回的是一个指向文件结构的指针。
fopen是C标准函数,因此拥有良好的移植性
Fopen是从来操纵普通正规文件(Regular File)。
fopen属于高级IO函数,低级和高级的简单区分标准是:谁离系统内核更近,低级文件IO运行在内核态、高级文件IO运行在用户态。
fopen有缓冲区,fopen是在缓冲区中进行文件操作的。
对应函数:为fwrite,fread,fclose等
2.fopen的使用
#iclude<stdio.h>
FILE *fp;
FILE *fopen(const char *path, const char *mode);
const char *path:要打开的文件名
const char *mode:打开文件的权限
pf = fopen("/file.txt","w+"); 举例说明
"w+":一定要加双引号。
fopen的打开方式:
mode打开模式:r : 只读方式打开一个文本文件
w:只写方式打开一个文本文件
r+:可读可写方式打开一个文本文件
w+:可读可写方式创建一个文本文件
w+b:可读可写方式创建一个二进制文件
三.popen
1.popen函数原型
FILE *popen(const char *command, const char *type);
功能:popen()函数通过先创建一个管道,然后调用 fork 产生一个子进程,让子进程执行shell中的command命令。popen()建立的管道会连到子进程的标准输出设备(stdin)或标准输入设备(stdout),然后返回一个文件指针。
随后进程便可利用此文件指针来读取子进程的输出设备或是写入到子进程的标准输入设备中。
参数:
command:要执行的命令。
type:
如果 type 为r,则将子进程的标准输出(stdout)连接到返回的的文件指针。
如果 type 为 w,则将子进程的标准输入(stdin)连接到返回的的文件指针。
返回值:
调用成功就返回一个文件指针,如果此函数内部在调用 fork() 或 pipe() 失败,或者不能分配内存将返回NULL。
2.应用方法
#include <stdio.h>
int main()
{
FILE* fp = popen("ls -l", "r");
if (!fp)
{
perror("popen fail: ");
}
char buf[1024];
while (fgets(buf, sizeof(buf), fp) != NULL)
{
printf("%s", buf);
}
pclose(fp);
return 0;
}