linuxc编程:⽂件的读写Linux系统中提供了系统调⽤函数open()和close()⽤于打开和关闭⼀个存在的⽂件
int open(const char *pathname,int flags)
int open(const char *pathname,int flags,mode_t mode)
int open(const char *pathname,mode_t mode)
其中flag代表⽂件的打开⽅式
O_RDONLY: 以只读⽅式打开⽂件
O_WRONLY:以只写的⽅式打开⽂件
O_RDWR:以读写的⽅式打开⽂件
O_CREAT:若打开的⽂件不存在,则创建该⽂件
O_EXCL:如果打开⽂件是设置了O_CREAT,但是该⽂件存在,则导致调⽤失败
O_TRUNC:如果以只写或只读⽅式打开⼀个已存在的⽂件,将该⽂件截⾄0
O_APPEND:追加的⽅式打开⽂件
O_NONBLOCK:⽤于⾮堵塞接⼝i/o
O_NODELAY
O_SYNC:当数据被写⼊外存或者其他设备后,操作才返回。
其中mode是打开的权限
S_IRWXU 00700 设置⽂件所有者的读,写,执⾏权限
S_IRWXG 00070 设置⽂件所在⽤户组的读,写,执⾏权限
S_IRWXO 00007 设置其他⽤户的读,写,执⾏权限
S_IRUSR 00400 设置⽂件所有者的读权限
S_IWUSR 00200 设置⽂件所有的写权限
S_IXUSR 00100 设置⽂件所有者的执⾏权限
S_IRGRP 00040 设置⽤户组的读权限
S_IWGRP 00020 设置⽤户组的写权限
S_IXGRP 00010 设置⽤户组的执⾏权限
S_IROTH 00004 设置其他⽤户的读权限
S_IWOTH 00002 设置其他⽤户的写权限
S_IXOTH 00001 设置其他⽤户的执⾏权限
⽂件的读操作:
ssize_t read(int fd,void *buf,size_t count);
fd代表⽂件描述符,buf代表读取的数据存放的buf指针所指向的缓冲区,count代表读取数据的字节数函数调⽤成功,返回为读取的字节数,否则返回-1
⽂件读和写的例⼦
void open_and_read_file()
{
int fd,n;
char buf[100];
char *path="/home/zhf/zhf/c_prj/";
fd=open(path,O_RDWR);
n=read(fd,buf,20);
printf("the content is %s\n",buf);
}
在这⾥⽂件都是从头开始读的,那么如果我想从某个位置⽐如第N个字节开始读取的时候该如何操作呢,这⾥就需要⽤到⽂件定位函数lseek off_t lseek(int fildes,off_t offset,int whence);\
fildes是⽂件描述符
offset是偏移量
whence代表⽤于偏移时的相对位置,可以取如下的⼏个值
SEEK_SET: 从⽂件的开头位置计算偏移量
SEEK_CUR: 从当前的位置开始计算偏移量
SEEK_END: 从⽂件的结尾开始计算偏移量
函数修改如下:⾸先采⽤lseek函数将⽂件定位到从第11个字节开始,然后read将从第11个字节开始读取。
对于写操作也是⼀样的。
void open_and_read_file()
{
int fd,n;
char buf[100];
char *path="/home/zhf/zhf/c_prj/";
int i;
fd=open(path,O_RDWR);
i=lseek(fd,11,SEEK_SET);
n=read(fd,buf,20);
printf("the content is %s\n",buf);
close(fd);
}
⼀个完整的创建,读,写⽂件的例⼦:
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
void write_file(int fd){
char buf[]="abcde\n";
write(fd,buf,sizeof(buf));
close(fd);
}
void read_file(){
int fd;
char *path="/home/";
char result[20];
fd=open(path,O_RDONLY);
linux怎么读文件内容read(fd,result,10);
printf("The content is %s",result);
close(fd);
}
int create_file(){
int fd;
char *path="/home/";
fd=creat(path,00777);
return fd;
}
前⾯介绍的操作都是基于⽂件描述符的⽂件操作,下⾯来介绍基于流的⽂件操作。两者有什么区别呢:
缓冲⽂件系统的特点是:在内存开辟⼀个“缓冲区”,为程序中的每⼀个⽂件使⽤,当执⾏读⽂件的操作
时,从磁盘⽂件将数据先读⼊内存“缓冲区”,装满后再从内存“缓冲区”依此读⼊接收的变量。执⾏写⽂件的操作时,先将数据写⼊内存“缓冲区”,待内存“缓冲区”装满后再写⼊⽂件。由此可以看出,内存 “缓冲区”的⼤⼩,影响着实际操作外
存的次数,内存“缓冲区”越⼤,则操作外存的次数就少,执⾏速度就快、效率⾼。⼀般来说,⽂件“缓冲区”的⼤⼩随机器⽽定。主要有fopen, fclose, fread, fwrite, fgetc, fgets, fputc, fputs, freopen, fseek, ftell, rewind等
2.⾮缓冲⽂件系统
缓冲⽂件系统是借助⽂件结构体指针来对⽂件进⾏管理,通过⽂件指针来对⽂件进⾏访问,既可以读写字符、字符串、格式化数据,也可以读写⼆进制数据。⾮缓冲⽂件系统依赖于操作系统,通过操作系统的功能对⽂件进⾏读写,是系统级的输⼊输出,它不设⽂件结构体指针,只能读写⼆进制⽂件,但效率⾼、速度快,由于ANSI标准不再包括⾮缓冲⽂件系统,因此建议⼤家最好不要选择它。本书只作简单介绍。open, close, read, write, getc, getchar, putc, putchar 等。
open 是系统调⽤返回的是⽂件句柄,⽂件的句柄是⽂件在⽂件描述副表⾥的索引,fopen是C的库函数,返回的是⼀个指向⽂件结构的指针。
linux中的系统函数是open,fopen是其封装函数。fopen可以移植,open不能
来看fopen函数:FILE *fopen(const char *path,const char *mode)
path代表⽂件名路径
mode代表⽂件的打开⽅式。有 r,r+,w,w+,a,a+等⽅式
fgetc()函数:从⽂件读取1个字节 int fgetc(FILE *stream). 如果出错或者读到⽂件末尾,则返回EOF
fputc()函数:向指定的⽂件写⼊1个⽂件 int fputc(int c,FILE *stream);
实例代码:
void fopen_file()
{
int i;
char ch;
FILE *fp;
char *path="/home/zhf/zhf/c_prj/";
fp=fopen(path,"r");
for(i=0;i<5;i++)
{
if ((ch=fgetc(fp)) != EOF)
{
printf("%c",ch);
}
}
}
fputc和fgetc函数只能⼀次性的读取或者写⼊⼀个字节,如果想读取或者写⼊⼀个字符串则需要⽤到fgets()和fputs()函数。
Char *fgets(char *s,int size, FILE *stream);
读取到’\n’转移字符为结束,并在该⾏末尾添加⼀个’\0’组成完成的字符串。在size字节范围内没有读到’\n’结束符,则添加⼀个’\0’
int fputs(const char *s, FILE *stream);
void fopen_file()
{
int i;
char ch;
char *str;
FILE *fp;
char *path="/home/zhf/zhf/c_prj/";
char result[100];
fp=fopen(path,"r");
str=fgets(result,20,fp);
printf("%s\n",str);
fclose(fp);
}
同样的基于流操作的也有⽂件的定位操作函数分别是fseek函数和rewind函数
int fseek(FILE *stream,long offset,int whence)
这⾥offset表⽰移动的字节数,要求位移量是long型数据。以便在⽂件长度⼤于64Kb不会出错whence和前⾯介绍的⼀样。
rewind函数的作⽤是使位置指针重新返回⽂件的开头,函数没有返回值。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。