fileno函数(FILE* fp -> int fd)
int fileno(FILE *stream);
功能:获得一个文件流指针中的文件描述符
参数:stream:文件流指针
返回值:成功返回文件描述符,失败返回-1
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
//FILE*---> int fd;
FILE* fp = fopen("1.txt","r");
if(NULL == fp)
{
printf("fopen error\n");
return 1;
}
char buf[256]={0};
int fd = fileno(fp);
read(fd, buf,sizeof(buf)-1);
printf("%s\n",buf);
fclose(fp);
return 0;
}
fdopen (int fd -> FILE *fp)
FILE *fdopen(int fd, const char *mode);
功能:将文件描述符转化为文件流指针
参数:fd:已经打开的文件描述符
mode:"r","r+","w","w+","a","a+"。和转之前的fd类型一致
返回值:成功返回文件流指针,失败返回NULL。
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main(int argc, char *argv[])
{
//FILE*---> int fd;
int fd = open("1.txt",O_RDONLY);
if(-1 == fd)
{
printf("fopen error\n");
return 1;
}
char buf[256]={0};
FILE* fp = fdopen(fd,"r");
if(NULL == fp)
{
printf("fdopen error\n");
return 1;
}
fgets(buf,sizeof(buf),fp);
printf("%s\n",buf);
fclose(fp);
return 0;
}
注:没有特殊要求关闭文件用调用度高的。
read函数使用是将文件看作二进制,不含'\0',所以正常读的数据要比整体数据少一个,留一个位置放'\0',而fgets()函数自带'\0'。
一、打开目录(opendir)
DIR *opendir(const char *name);
功能:打开一个目录获得一个目录流指针
参数:name:目录名
返回值:成功返回目录流指针,失败返回NULL
二、读取目录(readdir)
一次只读一个,所以要使用循环调用(while(1))。
struct dirent *readdir(DIR *dirp);
功能:从目录流中读取文件信息并将保存信息的结构体地址返回
参数:dirp:目录流指针
返回值:包含文件信息的结构体,出错或者读到目录流末尾返回NULL
三、关闭目录(closedir)
int closedir(DIR *dirp);
功能:关闭之前已经打开的目录流对象
参数:opendir的返回结果中目录流对象
返回值:成功 0, 失败 -1;
打开读取关闭目录:
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
int main(int argc, char *argv[])
{
DIR *dir = opendir("./");
if(NULL == dir)
{
printf("opendir");
return 1;
}
while(1)
{
struct dirent * info = readdir(dir);
if(NULL == info)
{
break;
}
printf("%s\n",info->d_name);
}
closedir(dir);
return 0;
}
四、文件属性的获取
1.stat
int stat(const char *path, struct stat *buf);
功能:获得文件的属性
参数:path: 文件的路径,buf: 属性存放空间的首地址
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
struct stat st;
int ret = stat("./01ls.c",&st);
if(-1 == ret)
{
printf("stat error\n");
return 1;
}
printf("ino:%lu mode:%d link:%lu uid:%d gid:%d size:%lu time:%lu\n",st.st_ino, st.st_mode,st.st_nlink
,st.st_uid, st.st_gid,st.st_size,st.st_mtim.tv_sec);
return 0;
}
结果为:
2.st_mode(包含文件类型和mode(0666、0777))
使用man 7 inode
五、其他
1.chdir
int chdir(const char *path); // /home/linux
功能:改变当前程序的工作路径
参数:path:改变到的路径
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
int ret = chdir("../");
if(-1 == ret)
{
printf("chdir error\n");
return 1;
}
fopen("aaa","w");
return 0;
}
2.getcwd(pwd)
char *getcwd(char *buf, size_t size);
功能:获得当前的工作路径
参数:buf:保存工作路径空间的首地址,size:保存路径空间的长度
返回值:成功返回包含路径空间的字符串首地址,失败返回NULL
#include <stdio.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
char buf[512]={0};
getcwd(buf,sizeof(buf));
printf("current path is %s\n",buf);
int ret = chdir("../");
if(-1 == ret)
{
printf("chdir error\n");
return 1;
}
getcwd(buf,sizeof(buf));
printf("after change path is %s\n",buf);
return 0;
}
3.mkdir
int mkdir(const char *pathname, mode_t mode); //777 666 --x--x--x
功能:创建一个目录
参数:pathname:路径
mode:如0666、0777一样的权限,mode & ~umask 0002
返回值:成功返回0,失败返回-1
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
int main(int argc, char *argv[])
{
int ret = mkdir("bbb",0777);
if(-1 == ret)
{
printf("mkdir error\n");
return 1;
}
return 0;
}
4.rmdir
int rmdir(const char *pathname);
功能:删除一个空目录文件
参数:pathname:目录文件的名字
返回值:成功返回0,失败返回-1