标准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);
}