《Linux程序设计》第三章(标准IO库、格式化输入输出、文件和目录的维护、扫描目录)

标准IO库

  • 在启动程序时,有三个文件流是自动打开的,分别是stdin,stdout,stderr。
  • 1. fopen函数:用于文件和终端的输入和输出。函数原型如下:
  • #include <stdio.h>
    FILE *fopen(const char* filename,const char *mode);
  • mode 有几种形式。需要注意的是,filename和mode都必须是字符串,用双引号。
  • 2.fread函数从文件流stream中读取到ptr指向的缓冲区,size指定每个数据记录的长度,计数器nitems给出要传输的记录个数。
  • 函数原型是#include<stdio.h> size_t fread(void *ptr,size_t size,size_t nitems, FILE *stream);
  • 3.fwrite从指定的数据缓冲区中取出数据记录,并把它们写到输出流中。函数原型是
  • #include <stdio.h> size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);
  • 4.fclose函数关闭指定的流文件。函数原型是:#include <stdio.h> int fclose(FILE* stream)
  • 5.fflush函数将流文件中未写出的数据立刻写出。#include <stdio.h> int fflush(FILE *stream);
  • 6.fgetc、getc、getchar函数
  • 7.fputc、putc、putchar函数
  • 8.fgets和gets函数

格式化输入输出

  • 1.printf、fprintf和sprintf函数,它们能够控制格式输出
  • 2.scanf、fscanf和sscanf函数,它们控制格式输入
  • 3.其他流函数stdin、stdout、stderr函数
  • 4.为了表明错误,许多stdio库函数会返回一个超出范围的值,比如空指针或者EOF常数。错误由外部变量errno指出。
    #include <errno.h> extern int errno;
    也可以通过检查流的状态来确定是否发生了错误,或者到达了文件尾。
    #include <stdio.h>
    int ferror(FILE *stream);//测试一个文件流的错误表示
    int feof(FILE *stream);//测试一个文件流的尾标识
    void clearerr(FILE* stream);//清除由stream指向的文件流的文件尾标识和错误标识
  • 5.文件流和文件描述符
    每个文件流和底层文件描述符相关联。#include <stdio.h>
    int fileno(FILE *stream)
    FILE *fdopen(int fildes,const char *mode)

文件和目录的维护

  • 1.chmod系统调用可以改变文件或者目录的访问权限。函数原型如下:
    #include <sys/stat.h>
    int chmod(const char *path,mode_t mode);mode可以或操作。
  • 2.chown系统调用,能够改变文件的属主
    #include <sys/types.h>
    #include <unistd.h>
    int chown(const char* path, uid_t owner, gid_t group);
  • 3.unlink、link、symlink的系统调用:
  • 4.mkdir和rmdir系统调用:用来建立和删除目录
    #include <sys/types.h>
    #include <sys/stat.h>
    int mkdir(const char* path,mode_t mode)//建立目录
    #include <unistd.h>
    int rmdir(const char *path)//删除目录
  • 5.chdir系统调用和getcwd函数
    #include <unistd.h> int chdir(const char* path);//浏览目录
    #include <unistd.h> char *getcwd(char *buf,size_t size);//确定自己的当前目录

扫描目录

  • 1.opendir函数打开一个目录并创建一个目录流
    #include <sys/types.h>
    #include <dirent.h>
    DIR *opendir(const char *name);//如果大概的文件过多,opendir可能会失败
  • 2.readdir函数:返回一个指针,该指针值相等结构里保存着目录流dirp中下一个目录项的有关资料。
    #include <sys/types.h>
    #include <dirent.h>
    struct dirent *readdir(DIR *dirp);
  • 3.telldir函数返回值记录着一个目录流的当前位置
    #include <sys/types.h>
    #include <dirent.h>
    long int telldir(DIR *dirp);
  • 4.seekdir函数设置目录流dirp的目录项指针
    #include <sys/types.h>
    #include <dirent.h>
    void seekdir(DIR* drip,long int loc);
  • 5.closedir函数关闭一个目录流并释放与之有关的资源
    #include <sys/types.h>
    #include <dirent.h>
    int closedir(DIR *dirp);

打印目录的实验:

#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>

void printdir(char *dir,int depth)//打印目录
{
DIR *dp;
struct dirent *entry;
struct stat statbuf;
if((dp=opendir(dir))==NULL){
 fprintf(stderr,"cannot open directory:%s\n",dir);//如果没有打开目录,返回;
return;
}
chdir(dir);//浏览目录
while((entry=readdir(dp))!=NULL){/*目录项不为空,readdir返回一个dirent结构。该结构包含i节点和文件名*/
 lstat(entry->d_name,&statbuf);
if(S_ISDIR(statbuf.st_mode)){//判断是个目录
 if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0){continue;}
 printf("%*s%s/\n",depth,"",entry->d_name);
 printdir(entry->d_name,depth+4);
}
else{printf("%*s%s\n",depth,"",entry->d_name);}
}
chdir("..");
closedir(dp);

}

int main()
{
 printf("Directory scan of /home:\n");
 printdir("/home",0);
 printf("done.\n");
exit (0);
}

将main函数改为以下的样子能够打印目录:

int main(int argc,char* argv[])
{
 char *topdir=".";
 if(argc>=2){topdir=argv[1];}
 printf("Directory scan of %s\n",topdir);
 printdir(topdir,0);
 printf("done.\n");
exit (0);
}

猜你喜欢

转载自blog.csdn.net/eriHanami/article/details/82929125
今日推荐