#include
FILE *fopen(const char *path, const char *mode);
// const char* 保护实参不被修改
path 文件名(包含路径:绝对路径或者相对路径)
mode 文件打开的方式
r 以只读方式打开 文件必须已存在
r+ 以读写方式打开 文件必须已存在
w 以只写方式打开 如果不存在 则创建并打开 存在则清空并打开
w+ 以读写方式打开 如果不存在 则创建并打开 存在则清空并打开
a 以追加写的方式打开 如果文件不存在 则创建并打开
a+ 以追加读写的方式打开 如果文件不存在 则创建并打开
返回值 成功返回FILE* 类型指针(文件流指针) 失败返回NULL
#include
#include //exit头文件
int main()
{
FILE * fp=NULL;
//只写的方式打开文件
fp = fopen("first.txt","w");//调用
if(NULL==fp)//#define NULL (void *)0
{
printf("文件打开失败\n");
exit(-1);//退出整个程序
}
return 0;
}
程序运行时 系统自动打开3个流
描述 | 类型 | 含义 |
---|---|---|
stdin | FILE * stdin | 从标准输入取数据,默认是键盘 |
stdout | FILE * stdout | 向标准输出设备输出,默认是显示器 |
stderr | FILE * stderr | 向标准错误输出设备输出,默认是显示器 |
#include
int fclose(FILE *fp);// fclose(fp);
//功能:关闭文件
#include
void perror(const char *s);
//功能:返回上一个函数的错误信息
//参数:实际错误信息
#include
char *fgets(char *s, int size, FILE *stream);
//功能:从文件中读取一行
s: 读取的数据存放的位置
size: 最多读多大 实际最多能读到的有效字符 size-1个字节
stream: 从stream文件中读取一行
返回值: 成功 返回读到的数据 ,失败或者到文件结尾 返回NULL
备注
如果size < 行字节数,实际读取有效字符size - 1,剩下的字符需要循环读取 直到 ’\n’。
如果size > 行字节数,实际读到一行。(遇到 ’\n’ 停止)
#include
int fputs(const char *s, FILE *stream);
//功能:向文件中写入一行
//存在文件 stu.txt (有内容),读取stu.txt内容,并将读到的内容写入note.txt
#include
#include
#include
//./mycp first.txt note.txt
int main(int argc,char *argv[])
{
//argc!=3 错误处理
if(argc!=3)
{
printf("%s 源文件名 目标文件名\n",argv[0]);
exit(-1);
}
char buf[100]="\0";
char *pret = NULL;
//1.打开源文件 fpSrc argv[1] "r"
FILE *fpSrc = fopen(argv[1],"r");
if(NULL==fpSrc)
{
perror("fopenSrc");
exit(-1);
}
//2.打开目标文件 fpDst argv[2] "w"
FILE * fpDst = fopen(argv[2],"w");
if(NULL==fpDst)
{
perror("fopenDst");
exit(-1);
}
//循环导数据
while(1)
{
pret = fgets(buf,sizeof(buf),fpSrc);
//错误处理
if(NULL==pret)
{
break;
}
fputs(buf,fpDst);
bzero(buf,sizeof(buf));
}
//3.关闭两个文件
fclose(fpSrc);
fclose(fpDst);
}
#include
void bzero(void *s, size_t n);
//功能:将地址s的前n个字节清零
#include
int fputc(int c, FILE *stream);
//功能:输出一个字符到文件
#include
#include
int main()
{
FILE *fp = fopen("first.txt","w");
if(NULL==fp)
{
perror("fopen");
exit(-1);
}
//将字符'a'写入fp
fputc('a',fp);
char ch='x';
fputc(ch,fp);
fclose(fp);
return 0;
}
#include
int fgetc(FILE *stream);
//功能:从文件中读取一个字符
#include
#include
int main()
{
FILE *fp = fopen("file.txt","r");//
if(NULL==fp)
{
perror("fopen");
exit(-1);
}
char ch;
//从文件fp中读取一个字符
ch = fgetc(fp);//getchar();
printf("%c",ch);
while(1)
{
ch = fgetc(fp);//getchar();
if(EOF==ch)
{
break;
}
printf("%c",ch);
}
fclose(fp);
return 0;
}
#include
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);// 10
//功能:按指定大小读 任意类型
#include
#include
int main()
{
FILE *fp = fopen("file.txt","r");
if(NULL == fp)
{
perror("fopen");
exit(-1);
}
int i;
char buf[5] = "\0";
//从文件fp读取数据存入buf,每次读1个字符,读取sizeof(buf)次
fread(buf,1,sizeof(buf),fp);
for(i = 0;i < 5;i++)
{
printf("%c",buf[i]);
}
return 0;
}
size_t fwrite(const void *ptr, size_t size, size_t nmemb,FILE *stream);
//功能: 按指定大小写
#include
#include
#include
int main()
{
FILE *fp = fopen("first.txt","w");
if(NULL = fp)
{
perror("fopen");
exit(-1);
}
char buf[50] = "hello world";
fwrite(buf,3,sizeof(buf),fp);
//关闭文件
fclose(fp);
return 0;
}
#include
int feof(FILE *stream);
//功能:测试文件位置指针是否到达文件结尾
#include
#include
#include
int main()
{
FILE *fp = fopen("test9.c","r");
if(NULL == fp)
{
perror("fopen");
exit(-1);
}
char buf[50] = "\0";
//循环读取文件内容显示到屏幕
while(1)
{
fread(buf,1,sizeof(buf),fp);
printf("%s",buf);
if(feof(fp))
{
break;
}
bzero(buf,sizeof(buf));
}
//关闭文件
fclose(fp);
return 0;
}
void rewind(FILE *stream);
//功能:将文件位置指针定位到文件的起始位置
#include
#include
#include
int main()
{
FILE *fp = fopen("first.txt","w+");
if(NULL == fp)
{
perror("fopen");
exit(-1);
}
char buf[50] = "hello world";
fwite(buf,3,sizeof(buf),fp);
//将文件位置指针定位到文件起始位置
rewind(fp);
bzero(buf,sizeof(buf));
fread(buf,1,sizeof(buf),fp);
printf("read:%s\n",buf);
//关闭文件
fclose(fp);
return 0;
}
#include
int fseek(FILE *stream, long offset, int whence);
//功能:定位文件位置指针
#include
long ftell(FILE *stream);
//功能:返回当前文件位置指针的位置(测试当前文件位置指针相对文件开头距离)
long n = ftell(fp);
printf("%ld\n",n);
return 0;
#include
#include
#include
int open(const char *pathname, int flags, mode_t mode);
//功能: 打开或创建文件
参数1:打开的文件的路径 包括文件名 路径:可以是绝对路径 也可以是相对路径
参数2:打开文件的方式
参数3:对新文件的访问权限 可有可无 如果参数2是O_CREAT 则参数3生效
返回值:成功返回文件描述符 失败-1
O_RDONLY 只读打开
O_WRONLY 只写打开
O_RDWR 读、写打开
大多数实现将 O_RDONLY 定义为 0 ,O_WRONLY定义为 1 ,O_RDWR定义为 2
O_EXEC 只执行打开
O_SEARCH 只搜索打开
上述 5 个常量中必须指定且只能指定一个。下列常量则是可选的。
分配规则:当前尚未分配的最小的非负整数
文件属性 | 文件所有者 | 文件所属组 | 文件大小 | 文件创建时间 | 文件名 | |||
---|---|---|---|---|---|---|---|---|
-rw-rw-r– | 1 | linux | linux | 90 | Aug | 4 | 01:22 | create.c |
例:drwxrwxr-x
第一个字符代表文件类型
目录文件 directory file。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读权限的任一进程都可以读该目录的内容,但只有内核可以直接写目录文件。进程必须使用函数才能更改目录。
普通文件 regular file。这是最常用的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据,对于内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。
字符特殊文件 character special file。这种类型的文件提供对设备不带缓冲的访问,每次访问长度可变。系统中的所有设备要么是字符特殊文件,要么是块特殊文件。
符号链接 symbolic link。这种类型的文件指向另一个文件。
快特殊文件 block special file。这种类型的文件提供对设备(如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。
套接字 socket。这种类型的文件用于进程间的网络通信。套接字也可用于在另一台宿主机上进程之间的非网络通信。
FIFO。这种类型的文件用于进程间通信,有时也称为命名管道(named pipe)。
#include
int close(int fd);
//功能:关闭文件fd
#include
ssize_t write(int fd, const void *buf, size_t count);
//功能:将数据写入文件
#include
ssize_t read(int fd, void *buf, size_t count);
//功能:从文件中读数据
#include
#include
off_t lseek(int fd, off_t offset, int whence);
//功能:为一个打开文件设置偏移量(文件位置指针定位)
#include
#include
DIR *opendir(const char *name);
//功能:打开目录流
#include
#include
int closedir(DIR *dirp);
//功能:关闭目录
#include
struct dirent *readdir(DIR *dirp);
//功能:读取目录
struct dirent
{
ino_t d_ino; /* inode number */inode编号 文件编号
off_t d_off; /* offset to the next dirent */
unsigned short d_reclen; /* length of this record */
unsigned char d_type; /* type of file; not supported by all file system types */
char d_name[256]; /* filename */ 文件名
};
#include
#include
#include
int stat(const char *path, struct stat *buf);//stat("a.txt",&s);
//功能:获取path文件属性 将其保存到buf 不能获取链接文件属性
//定义于 /usr/include/sys/stat.h 文件中
struct stat
{
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */ inode 文件编号
mode_t st_mode; /* protection */文件操作权限 文件类型
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */\\p00
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */ 文件大小
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
stat用来判断没有打开的文件,我们使用最多的属性是st_mode。通过此属性我们可以判断给定的文件是一个普通文件还是一个目录、链接等等。可以使用下面几个宏来判断。
宏 | 文件类型(符合返回真,否则返回假) |
---|---|
S_ISLNK(st_mode) | 判断是否是一个连接 |
S_ISREG(st_mode) | 判断是否是一个常规文件 |
S_ISDIR(st_mode) | 判断是否是一个目录 |
S_ISCHR(st_mode) | 判断是否是一个字符设备 |
S_ISBLK(st_mode) | 判断是否是一个块设备 |
S_ISFIFO(st_mode) | 判断是否是一个FIFO文件 |
S_ISSOCK(st_mode) | 判断是否是一个SOCKET文件 |