赞
踩
#include <stdio.h>FILE *fopen(const char *path, const char *mode);path : 参数 path 指向文件路径,可以是绝对路径、也可以是相对路径。mode : 参数 mode 指定了对该文件的读写权限,是一个字符串,稍后介绍。返回值: 调用成功返回一个指向 FILE 类型对象的指针( FILE * ),该指针与打开或创建的文件相关联,后续的标准 I/O 操作将围绕 FILE 指针进行。如果失败则返回 NULL ,并设置 errno 以指示错误原因。
删除文件unlink()函数
前面给大家介绍 link 函数,用于创建一个硬链接文件,创建硬链接时,inode 节点上的链接数就会增加;unlink()的作用与 link()相反,unlink()系统调用用于移除/删除一个硬链接(从其父级目录下删除该目录条目)。
#include <unistd.h>int unlink(const char *pathname);pathname : 需要删除的文件路径,可使用相对路径、也可使用绝对路径,如果 pathname 参数指定的文件不存在,则调用 unlink() 失败。返回值: 成功返回 0 ;失败将返回 -1 ,并设置 errno 。
删除文件remove() 函数(用于移除一个文件或空目录)
与 unlink()、rmdir()一样,remove()不对软链接进行解引用操作,若 pathname 参数指定的是一个软链接文件,则 remove()会删除链接文件本身、而非所指向的文件。
pathname 参数指定的是一个非目录文件,那么 remove()去调用 unlink(),如果 pathname 参数指定的是一个目录,那么 remove()去调用 rmdir()。(这是个boss)
#include <stdio.h>int remove(const char *pathname);pathname : 需要删除的文件或目录路径,可以是相对路径、也可是决定路径。返回值: 成功返回 0 ;失败将返回 -1 ,并设置 errno 。
文件重命名rename()函数
#include <stdio.h>int rename(const char *oldpath, const char *newpath);oldpath : 原文件路径。newpath : 新文件路径。返回值: 成功返回 0 ;失败将返回 -1 ,并设置 errno 。
- //可以重命名,可以用来移动位置
- ret = rename("./test_file", "./new_file");
新建文件的权限
虽然调用 fopen()函数新建文件时无法手动指定文件的权限,但却有一个默认值:
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH (0666)
fclose()关闭文件
#include <stdio.h>
int fclose(FILE *stream);
#include <stdio.h>size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);ptr : fread() 将读取到的数据存放在参数 ptr 指向的缓冲区中;size : fread() 从文件读取 nmemb 个数据项,每一个数据项的大小为 size 个字节,所以总共读取的数据大小为 nmemb * size 个字节。nmemb : 参数 nmemb 指定了读取数据项的个数。stream : FILE 指针。返回值: 调用成功时返回读取到的数据项的数目(数据项数目并不等于实际读取的字节数,除非参数 size 等于 1 );如果发生错误或到达文件末尾,则 fread() 返回的值将小于参数 nmemb ,那么到底发生了错误还是到达了文件末尾,fread() 不能区分文件结尾和错误,究竟是哪一种情况,此时可以使用 ferror() 或 feof() 函数来判断,具体参考 4.7 小节内容的介绍。
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);ptr : 将参数 ptr 指向的缓冲区中的数据写入到文件中。size : 参数 size 指定了每个数据项的字节大小,与 fread() 函数的 size 参数意义相同。nmemb : 参数 nmemb 指定了写入的数据项个数,与 fread() 函数的 nmemb 参数意义相同。stream : FILE 指针。返回值: 调用成功时返回写入的数据项的数目(数据项数目并不等于实际写入的字节数,除非参数 size等于 1 );如果发生错误,则 fwrite() 返回的值将小于参数 nmemb (或者等于 0 )
- /* 打开文件 */
- if (NULL == (fp = fopen("./test_file", "w"))) {
- perror("fopen error");
- exit(-1);
- }
- /* 写入数据 */
- if (sizeof(buf) >
- fwrite(buf, 1, sizeof(buf), fp)) {
- printf("fwrite error\n");
- fclose(fp);
- exit(-1);
- }
#include <stdio.h>int fseek(FILE *stream, long offset, int whence);stream : FILE 指针。offset : 与 lseek() 函数的 offset 参数意义相同。whence : 与 lseek() 函数的 whence 参数意义相同。返回值: 成功返回 0 ;发生错误将返回 -1 ,并且会设置 errno 以指示错误原因;与 lseek() 函数的返回值意义不同,这里要注意! 调用库函数 fread()、 fwrite() 读写文件时,文件的读写位置偏移量会自动递增,使用 fseek() 可手动设置文件当前的读写位置偏移量。
#include <stdio.h>long ftell(FILE *stream);参数 stream 指向对应的文件,函数调用成功将返回当前读写位置偏移量;调用失败将返回 -1 ,并会设置 errno 以指示错误原因。
- #include <stdio.h>
- #include <stdlib.h>
- int main(void) {
- FILE *fp = NULL;
- int ret;
- /* 打开文件 */
- if (NULL == (fp = fopen("./testApp.c", "r"))) {
- perror("fopen error");
- exit(-1);
- }
- printf("文件打开成功!\n");
- /* 将读写位置移动到文件末尾 */
- if (0 > fseek(fp, 0, SEEK_END)) {
- perror("fseek error");
- fclose(fp);
- exit(-1);
- }
- /* 获取当前位置偏移量 */
- if (0 > (ret = ftell(fp))) {
- perror("ftell error");
- fclose(fp);
- exit(-1);
- }
- printf("文件大小: %d 个字节\n", ret);
- /* 关闭文件 */
- fclose(fp);
- exit(0);
- }
调用 fread()读取数据时,如果返回值小于参数 nmemb 所指定的值,表示发生了错误或者已经到了文件末尾(文件结束 end-of-file),但 fread()无法具体确定是哪一种情况;在这种情况下,可以通过判断错误标志或 end-of-file 标志来确定具体的情况。
#include <stdio.h>int feof(FILE *stream);
#include <stdio.h>int ferror(FILE *stream);
#include <stdio.h>void clearerr(FILE *stream);
#include <stdio.h>int printf(const char *format, ...);int fprintf(FILE *stream, const char *format, ...);int dprintf(int fd, const char *format, ...);int sprintf(char *buf, const char *format, ...);int snprintf(char *buf, size_t size, const char *format, ...);
#include <stdio.h>int scanf(const char *format, ...);int fscanf(FILE *stream, const char *format, ...);int sscanf(const char *str, const char *format, ...);
#include <stdio.h>int setvbuf(FILE *stream, char *buf, int mode, size_t size);stream : FILE 指针,用于指定对应的文件,每一个文件都可以设置它对应的 stdio 缓冲区。buf : 如果参数 buf 不为 NULL ,那么 buf 指向 size 大小的内存区域将作为该文件的 stdio 缓冲区,因为stdio 库会使用 buf 指向的缓冲区,所以应该以动态(分配在堆内存,譬如 malloc ,在 7.6 小节介绍)或静态的方式在堆中为该缓冲区分配一块空间,而不是分配在栈上的函数内的自动变量(局部变量)。如果 buf 等于 NULL ,那么 stdio 库会自动分配一块空间作为该文件的 stdio 缓冲区(除非参数 mode 配置为非缓冲模式)。mode : 参数 mode 用于指定缓冲区的缓冲类型,可取值如下:⚫ _IONBF : 不对 I/O 进行缓冲(无缓冲)。意味着每个标准 I/O 函数将立即调用 write() 或者 read() ,并且忽略 buf 和 size 参数,可以分别指定两个参数为 NULL 和 0 。标准错误 stderr 默认属于这一种类型,从而保证错误信息能够立即输出。⚫ _IOLBF : 采用行缓冲 I/O 。在这种情况下,当在输入或输出中遇到换行符 "\n" 时,标准 I/O 才会执行文件 I/O 操作。对于输出流,在输出一个换行符前将数据缓存(除非缓冲区已经被填满),当输出换行符时,再将这一行数据通过文件 I/O write() 函数刷入到内核缓冲区中;对于输入流,每次读取一行数据。对于终端设备默认采用的就是行缓冲模式,譬如标准输入和标准输出。⚫ _IOFBF : 采用全缓冲 I/O 。在这种情况下,在填满 stdio 缓冲区后才进行文件 I/O 操作( read 、 write )。对于输出流,当 fwrite 写入文件的数据填满缓冲区时,才调用 write() 将 stdio 缓冲区中的数据刷入内核缓冲区;对于输入流,每次读取 stdio 缓冲区大小个字节数据。默认普通磁盘上的常规文件默认常用这种缓冲模式。size : 指定缓冲区的大小。返回值: 成功返回 0 ,失败将返回一个非 0 值,并且会设置 errno 来指示错误原因。需要注意的是,当 stdio 缓冲区中的数据被刷入到内核缓冲区或被读取之后,这些数据就不会存在于缓冲区中了,数据被刷入了内核缓冲区或被读走了。
#include <stdio.h>void setbuf(FILE *stream, char *buf);
#include <stdio.h>void setbuffer(FILE *stream, char *buf, size_t size);
stat 函数是 Linux 中的系统调用,用于获取文件相关的信息
#include <sys/types.h>#include <sys/stat.h>#include <unistd.h>int stat(const char *pathname, struct stat *buf);pathname : 用于指定一个需要查看属性的文件路径。buf : struct stat 类型指针,用于指向一个 struct stat 结构体变量 。调用 stat 函数的时候需要传入一个 struct stat 变量的指针,获取到的文件属性信息就记录在 struct stat 结构体中,稍后给大家介绍 struct stat 结构体中有记录了哪些信息。返回值: 成功返回 0 ;失败返回 -1 ,并设置 error 。
- struct stat
- {
- dev_t st_dev; /* 文件所在设备的 ID */
- ino_t st_ino; /* 文件对应 inode 节点编号 */
- mode_t st_mode; /* 文件对应的模式 */
- nlink_t st_nlink; /* 文件的链接数 */
- uid_t st_uid; /* 文件所有者的用户 ID */
- gid_t st_gid; /* 文件所有者的组 ID */
- dev_t st_rdev; /* 设备号(指针对设备文件) */
- off_t st_size; /* 文件大小(以字节为单位) */
- blksize_t st_blksize; /* 文件内容存储的块大小 */
- blkcnt_t st_blocks; /* 文件内容所占块数 */
- struct timespec st_atim; /* 文件最后被访问的时间 */
- struct timespec st_mtim; /* 文件内容最后被修改的时间 */
- struct timespec st_ctim; /* 文件状态最后被改变的时间 */
- };
其中st_mode变量比较特殊,可以通过st_mode判断文件类型
S_IFSOCK 0140000 socket(套接字文件)S_IFLNK 0120000 symbolic link (链接文件)S_IFREG 0100000 regular file (普通文件)S_IFBLK 0060000 block device(块设备文件)S_IFDIR 0040000 directory (目录)S_IFCHR 0020000 character device (字符设备文件)S_IFIFO 0010000 FIFO (管道文件)
S_ISREG(m) #判断是不是普通文件,如果是返回 true ,否则返回 falseS_ISDIR(m) #判断是不是目录,如果是返回 true ,否则返回 falseS_ISCHR(m) #判断是不是字符设备文件,如果是返回 true ,否则返回 falseS_ISBLK(m) #判断是不是块设备文件,如果是返回 true ,否则返回 falseS_ISFIFO(m) #判断是不是管道文件,如果是返回 true ,否则返回 falseS_ISLNK(m) #判断是不是链接文件,如果是返回 true ,否则返回 falseS_ISSOCK(m) #判断是不是套接字文件,如果是返回 true ,否则返回 false
eg 判断文件所有者对该文件是否具有可执行权限
- if (st.st_mode & S_IXUSR) {
- //有权限
- } else {
- //无权限
- }
eg 通过 st_mode 变量判断文件类型 or 使用 Linux 系统封装好的宏来进行判断
- /* 判断是不是普通文件 */
- if ((st.st_mode & S_IFMT) == S_IFREG) {
- /* 是 */
- }
- /* 判断是不是链接文件 */
- if ((st.st_mode & S_IFMT) == S_IFLNK) {
- /* 是 */
- }
- /* 判断是不是普通文件 */
- if (S_ISREG(st.st_mode)) {
- /* 是 */
- }
- /* 判断是不是目录 */
- if (S_ISDIR(st.st_mode)) {
- /* 是 */
- }
目录在Linux中算是一种特殊的文件形式,因此标准C库中会有打开、创建文件夹、删除文件夹、读取文件夹以及遍历文件夹中的文件等函数
#include <sys/stat.h>#include <sys/types.h>int mkdir(const char *pathname, mode_t mode)pathname : 需要创建的目录路径。mode : 新建目录的权限设置,设置方式与 open 函数的 mode 参数一样,最终权限为( mode & ~umask )。返回值: 成功返回 0 ;失败将返回 -1 ,并会设置 errno 。 pathname 参数指定的新建目录的路径,该路径名可以是相对路径,也可以是绝对路径,若指定的路径名已经存在,则调用 mkdir() 将会失败
#include <unistd.h>int rmdir(const char *pathname);pathname : 需要删除的目录对应的路径名,并且该目录必须是一个空目录,也就是该目录下只有 . 和 .. 这两个目录项;pathname 指定的路径名不能是软链接文件,即使该链接文件指向了一个空目录。返回值: 成功返回 0 ;失败将返回 -1 ,并会设置 errno 。
opendir函数(打开目录)
opendir()函数用于打开一个目录,并返回指向该目录的句柄,供后续操作使用
#include <sys/types.h>#include <dirent.h>DIR *opendir(const char *name);name : 指定需要打开的目录路径名,可以是绝对路径,也可以是相对路径。返回值: 成功将返回指向该目录的句柄,一个 DIR 指针(其实质是一个结构体指针),其作用类似于open函数返回的文件描述符 fd ,后续对该目录的操作需要使用该 DIR 指针变量;若调用失败,则返回 NULL 。
closedir 函数(关闭目录)
#include <sys/types.h>#include <dirent.h>int closedir(DIR *dirp);dirp : 目录句柄。返回值: 成功返回 0 ;失败将返回 -1 ,并设置 errno 。
readdir函数(读取目录)
#include <dirent.h>struct dirent *readdir(DIR *dirp);dirp : 目录句柄 DIR 指针。返回值: 返回一个指向 struct dirent 结构体的指针,该结构体表示 dirp 指向的目录流中的下一个目录条目。在到达目录流的末尾或发生错误时,它返回 NULL 。
#include <sys/types.h>#include <dirent.h>void rewinddir(DIR *dirp);dirp : 目录句柄。返回值: 无返回值。
#include <unistd.h>char *getcwd(char *buf, size_t size);buf : getcwd() 将内含当前工作目录绝对路径的字符串存放在 buf 缓冲区中。size : 缓冲区的大小,分配的缓冲区大小必须要大于字符串长度,否则调用将会失败。返回值: 如果调用成功将返回指向 buf 的指针,失败将返回 NULL ,并设置 errno 。
- ptr = getcwd(buf, sizeof(buf));
- printf("Current working directory: %s\n", buf);
#include <unistd.h>int chdir(const char *path);int fchdir(int fd);path : 将进程的当前工作目录更改为 path 参数指定的目录,可以是绝对路径、也可以是相对路径,指定的目录必须要存在,否则会报错。fd : 将进程的当前工作目录更改为 fd 文件描述符所指定的目录(譬如使用 open 函数打开一个目录)。返回值: 成功均返回 0 ;失败均返回 -1 ,并设置 errno 。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。