Linux中文件编程可以使用两种方式,一是Linux系统调用,二是C语言库函数,前者依赖于Linux操作系统,后者与操作系统是独立的,在任何操作系统下,使用C语言库函数操作文件的方式都是相同的。
在国嵌的文件时间编程视频教程中,分别介绍了一些常用的基于Linux系统调用方式和C库函数方式操作文件的函数,还有就是对Linux时间数据进行获取,处理的函数。
一、Linux系统调用方式
1、文件创建:Int creat(const char *filename,mode_t mode)
Eg.(使用creat函数封装一个文件创建函数,并在主函数中调用,使用主函数所带参数来创建一个文件,并返回提示信息)
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void create_file(char *filename) //使用creat封装的文件创建子函数
{
if(creat(filename,0666)<0) //creat调用如果失败,则返回-1,成功则返回大于0的值,且创建的文件具有R:4,w:2可读可写的属性。
{
printf("create file %s failure!\n",filename);
exit(EXIT_FAILURE); //Linux系统宏定义EXIT_FAILTURE=1
}
else
{
printf("create file %ssuccess!\n",filename);
}
}
int main(intargc,char *argv[]) //main函数是可以带参数的,只是我们平时习惯了不带参数,只留一个空括号,且指定main函数的第一个参数argc为int型,用于统计主函数参数的个数,且程序名本身也是一个参数。第二个参数为argv,为一个字符串型指针数组,用于指向每一个参数的开头位置。参数在程序运行时,在其后加入运行参数即是了。
{
if(argc<2) //如果除了程序本身外不带其他参数(程序名本身也是一个参数,在Linux中,第一个参数为程序运行指令,如./hello。)**疑惑一**
{
printf("you haven't input thefilename,please try again!\n");
exit(EXIT_FAILURE);
}
create_file(argv[1]); //使用运行命令之后的参数创建文件名
exit(EXIT_SUCCESS); //EXIT_SUCCESS宏定义为0,所以exit(0)也是行的
}
运行:./creat hello 运行成功,则在当前工作目录下创建一个名为hello的文件。
2、文件打开:Int open(constchar* pathname,int flags)
Int open(const char*pathname,int flags,mode_t mode)
Eg.
Fd=open(argv[1],O_CREAT| O_RDWR,0777); //fd为返回的文件描述符,
3、文件关闭:Int close(int fd);fd为文件描述符
Eg.cleose(fd);
4、文件读操作:Int read(int fd,const void *buf,size_t length);
6、文件的读写指针定位:Int lseek(int fd,offset_t offset,int whence)
eg:(使用lseek函数获取文件的大小,利用该函数的返回值是读写指针相对于文件首地址的偏移)
Length=lseek(fd,0,SEEK_END)
7、文件的访问权限判断:判断某文件是否可以进行某种操作(读、写,可执行,是否存在等)
Int access(const char* pathname,int mode)
系统调用方式操作文件综合编程示例:(创建一个指定名字的新文件,并将另一个文件中的内容拷贝到新创建的文件中去)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> //fcntl.h,“l”不是数字1,是字母L的小写
#include <stdio.h>
#include <errno.h>
#define BUFFER_SIZE 1024
int main(int argc,char **argv)
{
int from_fd;
int to_fd;
char buffer[BUFFER_SIZE];
char *ptr;
int from_length,to_length;
if(argc!=3) //如果输入的参数数目不足,则提示错误
{
printf("Usage:%s fromfile tofile\n",argv[0]);
exit(1);
}
if((from_fd=open(argv[1],O_RDONLY))<0)//open打开成功,返回文件描述符,失败则返回-1
{
printf("Open %s Error\n",argv[1]);
exit(1);
}
if((to_fd=open(argv[2],O_WRONLY | O_CREAT,0755))<0) //O_CREAT表示打开的文件不存在,则先创建文件,权限为755
{
printf("Open %s Error\n",argv[2]);
exit(1);
}
while(from_length=read(from_fd,buffer,BUFFER_SIZE))//循环读取,直到read函数返回-1结束循环(read函数读取成功返回读取的实际字节数,读取失败返回-1)
{
ptr=buffer;
while(to_length=write(to_fd,ptr,from_length))//循环写,直到本次读取的数据全部写入
{
if(to_length==from_length) break;//写入的字节数等于读取的字节数,说明写入完成,退出一级while循环
else if(to_length<from_length)//如果写入的字节数小于读取的字节数,则写入未完成,继续写入数据
{
ptr+=from_length-to_length;//重定位开始读取buffer中数据的位置
write(to_fd,ptr,from_length-to_length);
break;
}
else break;
}
}
close(to_fd);
close(from_fd);//记得关闭文件
printf("copy file successed!\n");
exit(0);
}
二、C库函数调用方式
1、文件的创建和打开:FILE *fopen(const char *filename,const “char *mode”) //Mode有双引号,filename不可带双引号,不然也将被算作文件名的一部分。文件顺利打开
//后,指向该流的文件指针就会被返回。