1.open – 打开或创建一个文件
open(char *, flag, mode)在fcntl.h文件中声明。函数的作用:创建或打开某个文件,参数:最多有三个参数;
第一个参数,char * 包含有文件名和路径
第二个参数:flag 打开文件的方式
第三个参数:mode 创建文件的权限。
flag内容如下:
flag | 功能 |
---|---|
O_RDONLY | 只读 |
O_WRONLY | 只写 |
O_RDWR | 读写 |
O_CREAT | 创建一个文件 |
O_EXCL | 如果使用O_CREAT时文件存在,则可返回错误消息。这一 参数可测试文件是否存在。 |
O_TRUNC | 打开文件(会把已经存在的内容给删除) |
O_APPEND | 追加方式打开文件(不会把已经存在的内容给删除) |
返回值:
成功:文件描述符,它是一个非负的正整数,即文件的ID号,相当于人的身份证号;
出错:-1。
Open 函数创建文件时的权限是:
== mode & (~umask)
umask的默认值为0022 如果创建一个文件权限为777
B111 111 111 & ~(B 000 010 010) = B 111 101 101
此时文件的权限为755,如果想要使生成的文件权限为指定的777,则只需在命令行中 输入 umask 0000
文件描述符(file descriptor)
文件描述符是内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
2.write(int fd, void buf, size_t count ):
第一个参数:向哪一个文件中去写;第二个参数:向这个文件中写什么内容;第三个参数:向这个文件中写多少个。函数的返回值:是实际写的字节数。
标准的输入流:stdin 0
标准的输出流:stdout 1
标准的出错流:stderr 2
返回值:是实际写的字节数
3.read(int fd, void buf, size_t count)
第一个参数:从哪一个文件中去读;第二个参数:读到什么地方去;第三个参数:读多少个。函数的返回值:是实际读的字节数。
返回值:是实际读的字节数
4.leek(int fd, off_t offset, int whence),
该函数的头文件:sys/types.h unistd.h;
功能:调整读写的位置指针;
第一个参数:要调整的文件的文件描述符;
第二个参数:偏移量,每一读写操作所需要移动的距离,单位是字节的数量,可正可负(向前移,向后移);
第三个参数:当前位置的基点,有三个标志,
SEEK_SET:当前位置为文件的开头,新位置为偏移量的大小;
SEEK_CUR:当前位置为文件指针的位置,新位置为当前位置加上偏移量。
SEEK_END:当前位置为文件的结尾,新位置为文件的大小加上偏移量的大小。函数的
返回值:成功:文件当前的位置,出错:-1。
5、close(fd)
调用close()函数可以关闭一个打开的文件。
调用成功返回0,出错返回-1,并设置errno;
注:当一个进程终止时,该进程打开的所有文件都由内核自动关闭;
文件IO | 标准IO |
---|---|
open | fopen |
close | fclose |
lseek | fseek、rewind |
read、write | 读写函数较多分为(全缓存、行缓存、无缓存) |
全缓存:填满标准I/O缓存区才进行实际的I/O操作。磁盘上的了件用标准I/O打开,默认都是全缓存的。当缓存区填满或者进行flush操作时候才会进行磁盘操作。
行缓存:当输入输出遇到换行符、或者写满缓存区时,行缓存的大小1024字节、标准输入和标准输出都是行缓存(stdin、stiout)。
无缓存:不对I/O操作进行缓存,对流的读写可以立即操作实际文件。典型例子就是标准出错(stderr)
mode | 功能 |
---|---|
r或rb | 打开只读文件,该文件必须存在 |
r+或r+b | 打开可读写文件,该文件必须存在 |
w或wb | 打开只写文件,若文件存在则文件长度清为0,即会擦写文件以前内容。若文件不存在则建立该文件 |
w+或w+b或wb+ | 打开可读写文件,若文件存在则文件长度清为零,即会擦写文件 |
a或ab | 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会保留 |
a+或a+b或ab+ | 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会保留 |
*int fclose(FILE stream)
fclose()调用成功返回0,失败返回EOF,并设置errno
在该文件被关闭之前,刷新缓存中的数据。如果标准I / O库已经为该流自动分配了一个缓存,则释放此缓存。
fseek()、rewind()
fseek() 参数与lseek是一样的,但是返回值不一样
Lseek的返回值是:当前文件的位置指针值
fseek()的返回值是:成功返回0,失败返回-1,并设置errno
11. ftell(FILE *fp)
用于取得当前的文件位置,调用成功则为当前文件位置指示,若出错则为-1L
12 rewind(FILE *fp) 用于设定流的文件位置指示为文件开始,该函数调用成功无返回值。
rewind()等价于(void)fseek(fp 0, SEEK_SET)
行缓存读写函数
遇到新行符(\n) 或写满缓存时,即调用系统调用函数
读:fgets, gets, printf, fprintf,sprintf
写:fputs, puts,scanf
char fgets (char s, int size, FILE stream)
第一个参数:缓存,即读到哪里去
第二个参数:读多少个字节
第三个参数:从什么地方读
返回值若成功则为s(缓存的地址),若已处文件尾端或出错则为null
int fputs(const char s,FILE stream);
第一个参数:缓存,即写什么内容
第二个参数:写到哪里去
若成功则为非负值,若出错则为EOF -1 。
行缓存的读写函数gets和puts
*char gets(char s);
int puts(const char s);
gets 与fgets的区别:
gets()时不能指定缓存的长度,这样就可能造成缓存越界(如若该行长于缓存长度),写到缓存之后的存储空间中,从而产生不可预料的后果,所以永远不要使用gets函数;
gets()只能从标准输入中读;
gets()与fgets()的另一个区别是: gets()并不将新行符存入缓存中, fgets 将新行符存入缓存中;
puts 与fputs的区别:
puts()只能向标准输出中写;
puts()与fputs()的另一个区别是: puts 输出时会添加一个新行符, fputs不会添加;
fprintf、printf、sprintf 行缓存的函数
int fprintf(FILE *stream,”字符串格式”)
fprintf可以输出到文件中,也可输出到显示器,
printf 只能输出到显示器中。
int sprintf(str *, “字符串格式”)输出内容到一个字符串中
一个字符读写函数fgetc和fputc
int fgetc(FILE *fp)
功能:从文件中读取一个字符;
参数:文件流
返回值:正确为读取的字符,到文件结尾或出错时返回EOF。
int fputc(int c, FILE *fp)
功能:写一个字符到文件中
参数:第一个参数为要写的字符,第二个参数为文件流
返回值:成功则返回输入的字符,出错返回EOF。
对于fgets、fgetc函数如何判断是到了文件尾还是出错可以使用下面的函数
int feof(FILE stream);
功能:判断是否已经到文件结束
参数:文件流
返回值:到文件结束,返回为非0,没有则返回0
int ferror(FILE stream);
功能:判断是否读写错误
参数:文件流
返回值:是读写错误,返回为非0,不是则返回0
void clearerr(FILE stream);
功能:清除流错误
参数:文件流
全缓存函数
int fread(void ptr, size_t size, size_t nmemb, FILE stream);
int fwrite(const void ptr, size_t size, size_t nmemb,FILE stream);
ptr读取或写入的内存地址
size 每一个单元所占有的字节数
nmemb 一共多少个size
stream 从哪个文件读或写到那个文件去
目录IO
目录IO | 文件IO |
---|---|
opendir 打开目录 | open |
mkdir 创建目录 | creat |
readdir | read |
telldir 获取当前位置 | ftell |
seekdir | fseek |
rewinddir | rewind |
1.打开目录
#define
DIR *opendir(const char path)
path为打开路径
如果执行成功返回目录流指针,若失败返回NULL
closedir(DIR dir)
用于关闭目录流
2.创建/删除目录
创建目录 mkdir()
int mkdir(const char path,int mode)
path为创建的路径
mode设置该目录的访问权限
实际权限 mode&~umask
如果成功返回0 失败则返回-1
删除目录 rmdir()
int rmdir(const char path)
path为需删除的路径
如果成功返回0 失败返回-1
3.读写目录
readdir读取目录内容
目录文件中存储的为该目录下的文件名及对应的磁盘inode号,因此,读取目录内容即读取该目录下的文件名及文件信息,每调用一次readdir,其将返回指向下一条目录条目的指针,如果到达目录结尾,或者检测到无效的seekdir()操作,将返回NULL
struct dirent * readdir(DIR dirp)
struct dirent {
ino_t d_ino; // Inode号
off_t d_off; //从目录开始到当前目录条的距离
unsigned short d_reclen; //用以存储文件名的空间大小,根据文件名长度有差异
char d_name[256]; // 文件名,以’\0’结束
};
4.定位目录位置
telldir()
long int telldir(DIR dirp);
返回与dirp相关联的目录流的位置,如果成功返回一个long类型的位置值,否则返回-1
seekdir()
void seekdir(DIRdirp,long int loc)
此函数在dirp引用的目录流上设置下一个readdir()操作的位置。loc参数是从telldir()函数获取的目录流中的一个位置 只有 dirp目录流处于打开状态时,这些值才有效
rewinddir()
void rewinddir(DIR dirp)
将dirp引用的目录流位置重置到目录的开头