文件描述符
1、对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或者创建一个新文件时, 内核向进程返回一个文件描述符。当读写一个文件时,用open和creat返回的文件描述符标识该文件,将其作为参数传递给read和write.
按照惯例,UNIX shell使用文件描述符0与进程的标准输入相结合,文件描述符1与标准输出相结合,文件描述符2与标准错误输出相结合。STDIN_FILENO、STDOUT_FILENO、 STDERR_FILENO这几个宏代替了0、1、2这几个数。0:标准输入。
2、文件描述符,这个数字在一个进程中表示一个特定含义, 当我们open一个文件时, 操作系统在内存中构建了一些数据结构来表示这个动态文件,然后返回给应用程序一个数字作为文件描述符,这个数字就和我们内存中维护的这个动态文件的这些数据结构绑定上了,以后我们应用程序如果要操作这个动态文件,只需要用这个文件描述符区分。
3、文件描述符的作用域就是当前进程,出了这个进程文件描述符就没有意义了。
open函数打开文件,打开成功返回一个文件描述符,打开失败,返回-1。
man目录
1:可执行程序
2:系统调用
3:库函数
4:特殊文件
5:文件格式和规范
6:游戏
7:杂项,包括宏包和规范
8:系统管理命令
文件操作
open 打开 read/write 读写 lseek 光标定位 close 关闭
文件的权限:用 ls -l查看
程序:可读 r 4
可写 w 2
执行 x 1
例如0600:可读可写 不能执行
open函数
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int fd;
char *buf = "Dong Rui Long shi SB!";
fd = open("./test\n",O_RDWR);
if(fd == -1)
{
printf("open failed\n");
fd = open("./test",O_RDWR|O_CREAT,0600);
if(fd > 0)
{
printf("create test success!n");
}
}
printf("open success \nfd = %d\n",fd);
write(fd,buf,strlen(buf));
close(fd);
return 0;
}
我们可以看到文件已经写入成功 也生成了test无类型文件,我们打开它:
写入字符串成功
read函数
read从光标处开始读 所以要把光标移到头(重新定位光标 lseek) 或者 重新打开
set指头 cur指当前位置 end指尾巴
第二个参数是偏移值 对whence的一个偏移值
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main()
{
int fd;
char *buf = "Dong Rui Long shi SB!";
fd = open("./test\n",O_RDWR);
if(fd == -1)
{
printf("open failed\n");
fd = open("./test",O_RDWR|O_CREAT,0600);
if(fd > 0)
{
printf("create test success!\n");
}
}
printf("open success \nfd = %d\n",fd);
int n_write = write(fd,buf,strlen(buf));
if(n_write != -1)
{
printf("write %d byte to test\n",n_write);
}
//mession one:
//close(fd);
//fd = open("./test\n",O_RDWR);
char *readBuf;
readBuf = (char *)malloc(sizeof(char)*n_write + 1);
//lseek(fd,-(n_write),SEEK_CUR);
lseek(fd,0,SEEK_SET);
int n_read = read(fd,readBuf,n_write);
printf("read %d ,context:%s\n",n_read,readBuf);
close(fd);
return 0;
}
创建文件函数 creat
cp指令的练习
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc,char **argv)
{
int fdscr;
int fddes;
char *readbuf = NULL;
if(argc != 3)
{
printf("error!\n");
exit(-1);
}
fdscr = open(argv[1],O_RDWR);
int size = lseek(fdscr,0,SEEK_END);
lseek(fdscr,0,SEEK_SET);
readbuf = (char *)malloc(sizeof(char)*size + 8);
int n_read = read(fdscr,readbuf,size);
fddes = open(argv[2],O_RDWR|O_CREAT|O_TRUNC,0600);
int n_write = write(fddes,readbuf,strlen(readbuf));
close(fdscr);
close(fddes);
return 0;
}
配置文件的修改例子
待添加
标准c库写文件
fread和fwrite的size_t 返回值取决于第三个参数!
也可以将结构体应用 这里不想写了
其他文件api
fputc:
fgetc、feof:
一个个字符读文件
判断是否到达文件尾巴
#include <stdio.h>
int main ()
{
FILE *fp;
int c;
int n = 0;
fp = fopen("file.txt","r");
if(fp == NULL)
{
perror("打开文件时发生错误");
return(-1);
}
do
{
c = fgetc(fp);
if( feof(fp) )
{
break ;
}
printf("%c", c);
}while(1);
fclose(fp);
return(0);
}