头文件:#include
1、打开文件
函数原型:
int open(const char *pathname, int flags); //pathname:文件路径,flags:标记
int open(const char *pathname, int flags, mode_t mode); //mode:权限
返回类型:成功:返回一个整数(文件描述符),打开失败(返回-1)
文件描述符:
1>一个非负整数
2>用于表示一个打开的文件
3>在内核空间被引用,并有系统调用(open)所创建
4>read、write使用文件描述符
内核缺省打开三个文件描述符
文件描述符 1:标准输出
文件描述符 2:错误输出
文件描述符 0:标准输入
flags:标记
以下三个标记在打开文件的时候必须选一个(打开文件标记):
O_RDONLY :只读打开文件
O_WRONLY:只写打开文件
O_RDWR :读写打开文件
//-------------------------------------------------------
以下是打开文件标记:
O_CREAT:创建文件
O_EXCL:与O_CREAT组合表示:如果文件已经存在则报错
O_TRUNC:如果文件已经存在并且以下的方式打开,则清空文件0;
//------------------------------------------------------
O_APPEND:以追加的方式打开文件
file.c
clude
#include
#include
int main()
{
//以读写的方式打开文件a.txt
int fd = open("a.txt",O_RDWR);
if( -1 == fd )
perror("Error:"),exit(-1);
puts("打开文件成功");
printf("fd = %d\n",fd);
//创建文b.txt,并设置权限
int fd2 = open("b.txt",O_CREAT|O_RDWR,0666);
printf("fd2 = %d\n",fd2);
return 0;
}
2、读文件(将文件中的内容读到内存中)\写文件(将内存中的文件写到文件中)
write.c
#include
#include
#include
#include
int main()
{
//打开文件
int fd = open("a.txt",O_RDWR|O_TRUNC);
if( -1 == fd )
perror("错误"),exit(-1);
//准备数据
int useId = 100;
char * name = "jiezhj";
double salary = 100000.0001;
//写数据,写入成功,返回写入内容的长度,
ssize_t res = write(fd,&useId,sizeof(int));
if(res <= 0)
puts("写文件错误");
write(fd,name,strlen(name));
write(fd,&salary,sizeof(double));
//关闭文件
close(fd);
return 0;
}
read.c
int main()
{
//打开文件
int fd = open("a.txt",O_RDONLY);
if(-1 == fd)
perror("错误"),exit(-1);
//准备空间
int userId = 0;
char userName[20] = {0};
double salary = 0;
//按顺序读如数据
read(fd,&userId,sizeof(int));
read(fd,userName,6);
read(fd,&salary,sizeof(salary));
//输出内容
char buf[128] = {0};
sprintf(buf,"ID为%d的用户:%s的工资为%.2lf",userId,userName,salary);
puts(buf);
//关闭文件
close(fd);
}
注意:
read/write函数都是系统调用函数,运行在系统态,在实际的开发中尽量不要频繁调用。
如果要频繁的输出输入大量数据,应尽量使用(缓冲区)来减少调用read/write的次数,以提高效率。