标准IO库在启动程序时,有三个文件流是自动打开的,分别是stdin,stdout,stderr。
1. fopen函数:用于文件和终端的输入和输出。函数原型如下:
#include
FILE *fopen(const char* filename,const char *mode);
mode 有几种形式。需要注意的是,filename和mode都必须是字符串,用双引号。
2.fread函数从文件流stream中读取到ptr指向的缓冲区,size指定每个数据记录的长度,计数器nitems给出要传输的记录个数。
函数原型是#include size_t fread(void *ptr,size_t size,size_t nitems, FILE *stream);
3.fwrite从指定的数据缓冲区中取出数据记录,并把它们写到输出流中。函数原型是
#include size_t fwrite(const void *ptr, size_t size, size_t nitems, FILE *stream);
4.fclose函数关闭指定的流文件。函数原型是:#include int fclose(FILE* stream)
5.fflush函数将流文件中未写出的数据立刻写出。#include 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 extern int errno;
也可以通过检查流的状态来确定是否发生了错误,或者到达了文件尾。
#include
int ferror(FILE *stream);//测试一个文件流的错误表示
int feof(FILE *stream);//测试一个文件流的尾标识
void clearerr(FILE* stream);//清除由stream指向的文件流的文件尾标识和错误标识
5.文件流和文件描述符
每个文件流和底层文件描述符相关联。#include
int fileno(FILE *stream)
FILE *fdopen(int fildes,const char *mode)
文件和目录的维护1.chmod系统调用可以改变文件或者目录的访问权限。函数原型如下:
#include
int chmod(const char *path,mode_t mode);mode可以或操作。
2.chown系统调用,能够改变文件的属主
#include
#include
int chown(const char* path, uid_t owner, gid_t group);
3.unlink、link、symlink的系统调用:
4.mkdir和rmdir系统调用:用来建立和删除目录
#include
#include
int mkdir(const char* path,mode_t mode)//建立目录
#include
int rmdir(const char *path)//删除目录
5.chdir系统调用和getcwd函数
#include int chdir(const char* path);//浏览目录
#include char *getcwd(char *buf,size_t size);//确定自己的当前目录
扫描目录1.opendir函数打开一个目录并创建一个目录流
#include
#include
DIR *opendir(const char *name);//如果大概的文件过多,opendir可能会失败
2.readdir函数:返回一个指针,该指针值相等结构里保存着目录流dirp中下一个目录项的有关资料。
#include
#include
struct dirent *readdir(DIR *dirp);
3.telldir函数返回值记录着一个目录流的当前位置
#include
#include
long int telldir(DIR *dirp);
4.seekdir函数设置目录流dirp的目录项指针
#include
#include
void seekdir(DIR* drip,long int loc);
5.closedir函数关闭一个目录流并释放与之有关的资源
#include
#include
int closedir(DIR *dirp);
打印目录的实验:
#include
#include
#include
#include
#include
#include
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);
}