一.文件IO (不带缓存)----文件标识符(整数)//系统调用
1.打开–open
-
#include<fcntl.h>
-
int open(const char *pathname,int flags); n
-
int open(const char *pathname,int flags,mode_mode);
-
功能:打开或创建文件
-
参数:
@pathname //打开的文件
@flags //操作的标志
O_RDONLY //只读
O_WRONLY //只写
O_RDWR //读写
O_APPEND //追加
O_CREAT //文件不存在,创建
O_TRUNC //文件存在 截短为0
@mode 一般不用,当flags中使用了O_CREAT,需要指定mode
mode 0777
0666
0444
//实现touch功能 #include<stdio.h> #include<fcntl.h> int main(int argc, const char *argv[]) { if(argc != 2) { printf("Usage: %s <filename>\n",argv[0]); return -1; } int fd = open(argv[1],O_WRONLY | O_CREAT | O_TRUNC,0777); if(fd < 0) { perror("open fail"); return -1; } return 0; }-rwxrwxr-x 1 linux linux 0 2月 15 09:57 2.txt实际的文件不是0777,而是0775
文件创建好后的权限
- 制定的mode
- umask = 0002(掩码) //二进制 —遮住
- 最终文件的权限 = ~umask & mode
- 一般给mode权限一般是0666
-
返回值:成功 :文件描述符
失败 : -1 && errno会被设置
-
与fopen的区别
fopen—open
r --------- O_RDONLY
r±--------O_RDWR
w--------- O_WRONLY | O_CREAT | O_TRUNC
w±-------O_RDWR | O_CREAT | O_TRUNC
a--------- O_WRONLY | O_APPEND | O_CREAT
a±-------O_RDWR | O_APPEND | O_CREAT
2.读写–read/write
#include<unistd.h>
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd,const void *buf, size_t count);
-
read
-
功能:从fd中读数据,存在buf中
-
参数:@fd 要读取的文件
@buf 存放读取到的数据的内存空间
@count 一次要读取的数量 (字节)
-
返回值:成功 表示成功读到的字节数
失败 -1 && errno
- 读取结束: 0
#include<stdio.h> #include<unistd.h> int main(int argc, const char *argv[]) { char buf[1024] = {0}; while(1) { int ret = read(0,buf,100); buf[ret-1] = '\0'; printf("ret = %d buf = %s\n",ret,buf); } return 0; } -
write
-
功能:把buf写到fd中
-
参数:1.@fd 要写入的文件
2.@buf 存放数据的 内存空间
3.@count 一次要写入的数量(字节)
-
返回值:成功 表示成功写入的字节数
失败 -1 && errno
//实现cat #include<stdio.h> #include<fcntl.h> #include<unistd.h> int main(int argc, const char *argv[]) { if(argc != 2) { printf("usage: %s <filename>\n",argv[0]); return -1; } int fd = open(argv[1],O_RDONLY); if(fd < 0) { perror("open fail"); return -1; } ssize_t ret = 0; char buf[1024] = {0}; while((ret = read(fd,buf,sizeof(buf)-1)) != 0) { // buf[ret] = '\0'; // printf("%s",buf); write(1,buf,ret); } close( fd); return 0; }//实现cp #include<stdio.h> #include<fcntl.h> #include<unistd.h> int main(int argc, const char *argv[]) { if(argc != 3) { printf("usage: %s <filename>\n",argv[0]); return -1; } int fd1 = open(argv[1],O_RDONLY); int fd2 = open(argv[2],O_WRONLY | O_CREAT,0777); if((fd1 ||fd2) < 0) { perror("open fail"); return -1; } ssize_t ret = 0; char buf[1024] = {0}; while(1) { ret = read(fd1,buf,sizeof(buf)-1); if(ret == 0) break; write(fd2,buf,ret); } close( fd1); close( fd2); return 0; }
3.关闭–close
-
#include<unistd.h>
-
int close (int fd)
-
功能:关闭文件描述符,以便再次使用
-
参数:@fd 要关闭的文件描述符
-
返回:成功 0
是被 -1
-
文件描述符:1.非负整型的数值
2.分配原则:最小未使用
3. 0~1023
4.定位–lseek
-
off_t lseek(int fd,off_t offest,int whence).
功能:重新定位文件偏移量。
参数
@fd:要定位的文件描述符。@offset:偏移量。@whence:参考点。
参考点选项
SEEK_SET:相对于文件开头。offset >= 0。
SEEK_CUR:相对于当前位置。offset >= 0或offset < 0(不能超过文件开头)。
SEEK_END:相对于文件末尾。offset < 0(不能超过文件开头)。offset >= 0(可以创建空洞文件)。
返回值
-
成功:返回从文件开头的偏移量。
-
失败:返回
-1,并设置errno。 -
lssek(fd,0,SEEK_SET)
-
lssek(fd,0,SEEK_END)
-
获得文件长度 :off_t len = lseek(fd,0,SEEK END)
//获得空洞文件 #include<stdio.h> #include<fcntl.h> #include<unistd.h> int main(int argc, const char *argv[]) { if(argc != 2) { printf("Usage: %s <filename>\n",argv[0]); return -1; } int fd = open(argv[1],O_RDONLY); if(fd < 0) { perror("open fail"); return -1; } off_t len = lseek(fd,0,SEEK_END); int fd_d = open("hollo.txt",O_WRONLY | O_CREAT,0666); if(fd < 0) { perror("open fail"); return -1; } lseek(fd_d,len-1,SEEK_END); write(fd_d,"",1); close(fd); close(fd_d); return 0; }
5.标准IO操作 – 系统调用的函数
1.fdopen
-
将fd转换为FILE*
-
FILE *fdopen(int fd, const char *mode);
-
返回值:成功 :FILE *
失败: NULL;
2.fileno
-
将FILE * 转换为fd
-
int fileno(FILE *stream)
-
成功 :fd
-
失败 : - && errno
-
int feof (FILE *stream);
int ferror(FILE *stream);
3.opendir/readdir/closedir函数
-
DIR *opendir(const char *name);
功能:打开目录,关联一个目录流
参数:@name 要打开的目录名
返回值:
成功 返回DIR *
失败 NULL & errno#include <stdio.h> #include <dirent.h> int main(int argc, const char *argv[]) { DIR * dir = opendir(argv[1]); if (dir == NULL) { perror("opendir fail"); return -1; } printf("success\n"); return 0; } -
struct dirent *readdir(DIR *dirp);
功能:读取目录项
参数:@dirp 目录流指针
返回值:
成功 struct dirent *
失败 NULL && errno#include <stdio.h> #include <dirent.h> int main(int argc, const char *argv[]) { DIR * dir = opendir(argv[1]); if (dir == NULL) { perror("opendir fail"); return -1; } printf("success\n"); struct dirent *pdir = readdir(dir); printf("ino = %ld\n",pdir->d_ino); printf("type = %d\n",pdir->d_type); printf("name = %s\n",pdir->d_name); closedir(dir); closedir(dir); return 0; }struct dirent { ino_t d_ino; off_t d_off; unsigned short d_reclen;//Length of this record unsigned char d_type;//Type of file char d_name[256];//Null-terminated filename } -
int closedir(DIR *dirp);
功能:关闭目录流
参数:@dirp — 目录流指针
返回值:
成功 0
失败 -1 &&errno
//实现ls功能
#include <stdio.h>
#include <dirent.h>
int main(int argc, const char *argv[])
{
if (argc != 2)
{
printf("Usage: %s <dirname>\n",argv[0]);
return -1;
}
DIR * dir = opendir(argv[1]);
if (dir == NULL)
{
perror("opendir fail");
return -1;
}
struct dirent *pdir = NULL;
while (1)
{
pdir = readdir(dir);
if (pdir == NULL)
break;
if(pdir->d_name[0] != '.')
printf("%s ",pdir->d_name);
}
putchar('\n');
closedir(dir);
return 0;
}
//实现统计目录下,普通文件和目录文件的个数
while (1)
{
pdir = readdir(dir);
if (pdir == NULL)
break;
if (pdir->d_type == DT_REG)
{
cnt_r ++;
}else if (pdir->d_type == DT_DIR)
{
cnt_d ++;
}
4.chdir/getcwd
-
int chdir(const char *path);// /home/linux
功能:改变当前程序的工作路径
参数:path:改变到的路径
返回值:
成功 返回0
失败 返回-1 -
char *getcwd(char *buf, size_t size);
功能:获得当前的工作路径
参数:buf:保存工作路径空间的首地址
size:保存路径空间的长度
返回值:
成功返回包含路径空间的字符串首地址
失败返回NULL
#include <stdio.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
char buf[1024];
getcwd(buf,sizeof(buf));
printf("cwd = %s\n",buf);
chdir("/home");
getcwd(buf,sizeof(buf));
printf("cwd = %s\n",buf);
return 0;
}
//运行结果
cwd = /home/linux/04-dir
cwd = /home
```
5.mkdir/rmdir
- int mkdir(const char *pathname, mode_t mode);//777 666 --x–x–x
功能:创建一个目录
参数:pathname:路径
mode:
mode & ~umask 0002
返回值:
成功 返回0
失败 返回-1 - int rmdir(const char *pathname);
功能:删除一个空目录文件
参数:pathname:目录文件的名字
返回值:
成功 返回0
失败 返回-1
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, const char *argv[])
{
if (mkdir(argv[1],0777) < 0)
{
perror("mkdir fail");
return -1;
}
return 0;
}
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, const char *argv[])
{
if (rmdir(argv[1]) < 0)
{
perror("rmdir fail");
return -1;
}
return 0;
}
238

被折叠的 条评论
为什么被折叠?



