1、打开文件与关闭文件:
int main(void)
{
int fd; //定义的文件描述符
fd=open("1.txt",O_RDWR|O_CREAT|O_EXCL, 0644); //打开文件1.txt如果不存在则创建并可读可写
if(fd==-1) //fd返回-1则表示打开文件失败
{
// 以下两条语句效果完全一致:输出函数出错的原因
perror("open failed"); // 全局错误码声明所在的头文件#include <errno.h>
//使用perror(),直接输出用户信息和错误信息
printf("open failed:%s\n",strerror(errno));
//使用strerror(),返回错误信息交给用户自行处理
return 0;
}
close(fd); //关闭文件
return 0;
}
一般而言,perror()用起来更加方便,但有时候需要使用strerror()来输出一些更加灵活的信息 ;
注:perror函数会自己在结尾添加(:)冒号与('\n')换行 。
2、文件描述符:
- 文件描述符的概念:
- 函数 open() 的返回值,是一个整型 int 数据。
- 这个整型数据,实际上是打开文件时,内核产生一个指向 file{} 的指针,并将该指针放入一个位于 file_struct{} 结构体中的数组 fd_array[ ] 中,而该指针所在数组的下标,就被 open() 返回给用户,用户把这个数组下标称为文件描述符。
- 函数 open() 的返回值,是一个整型 int 数据。
- 文件描述符从0开始,每打开一个文件,就产生一个新的文件描述符。
打开文件最多打开1024个,如果计数就是1021个,因为从3开始计数,0,1,2被标准输入、标准输出和标准出错三个文件占用;
- 可以重复打开同一个文件,每次打开文件都会使内核产生系列结构体,并得到不同的文件描述符
- 由于系统在每个进程开始运行时,都默认打开了一次键盘、两次屏幕,因此0、1、2描述符分别代表标准输入、标准输出和标准出错三个文件(两个硬件)。
-
在Linux-C中
标准输入对应的名称是 stdin 键盘
标准输出对应的名称是 stdout 屏幕终端
标准出错对应的名称是 stderr 屏幕终端
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int fd;
fd=open("1.txt",O_RDWR|O_CREAT|0644);
if (fd==-1)
{
perror("open failed");
}
printf("%d\n",fd);
close(fd);
return 0;
}
输出:
3、文件的读写操作:
- 读取普通文件时,如果当读到了文件尾,read()会返回0。
读取文件:
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
int fd;
char buf[100]; //定义一个数组作为数据缓冲区
fd=open("1.txt",O_RDWR|O_APPEND);
if (fd==-1)
{
perror("open failed");
}
bzero(buf,sizeof buf);
int rt=read(fd,buf,sizeof buf); //从fd文件描述符中读取100个字节的数据存入buf中
if (rt==-1)
{
perror("read failed");
}
printf("文件内容为:%s\n",buf);
close(fd);
return 0;
}
输出:
写入数据:
#include <stdio.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc,char *argv[])
{
int fd;
char buf[128];
char buff[100];
fd=open("1.txt",O_RDWR|O_APPEND);
if (fd==-1)
{
perror("open failed");
}
bzero(buff,sizeof buff);
bzero(buf,sizeof buf);
fgets(buff,sizeof buff,stdin); //从键盘上写入数据并存入buff中
write(fd,buff,strlen(buff)); //将buff的内容写入fd文件描述符中
lseek(fd,0,SEEK_SET); //将文件光标移动到开头
int rt=read(fd,buf,sizeof buf);
if (rt==-1)
{
perror("read failed");
}
printf("文件内容为:%s\n",buf);
close(fd);
return 0;
}
输出:
4、写入位置的设置(光标):
对文件进行常规的读写操作的时候,系统会自动调整读写位置,以便于让我们顺利地顺序读写文件,但如果有需要,文件的读写位置是可以任意调整的,调整函数接口如下:
- lseek函数可以将文件位置调整到任意的位置,可以是已有数据的地方,也可以是未有数据的地方,假设调整到文件末尾之后的某个地方,那么文件将会形成所谓“空洞”。
- lseek函数只能对普通文件调整文件位置,不能对管道文件调整。
- lseek函数的返回值是调整后的文件位置距离文件开头的偏移量,单位是字节。
标签:文件,int,open,系统,fd,io,使用,include,buf From: https://blog.csdn.net/biubiuboomy/article/details/140855698