(大纲:
1.linux文件操作
2.linux文件操作
3.库函数文件操作
4.时间编程
linux系统调用方式访问文件
linux中文件的编程可以使用2种方法:linux系统调用和c语言库函数
linux系统调用:操作系统提供给用户程序的一组特殊的接口,用户程序可以通过这组特殊的接口来获得操作系统内核提供的特殊服务
Linux中用户程序不可以直接访问内核提供的服务
补充
Ubuntu vim编辑器自带的假如不好用我们需要卸载apt-get remove vim-common
apt-get install vim
一.linux文件操作
1.系统调用创建
需要调用的头文件头文件:#include
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
void creat_file(char *filename)
{
if(creat(filename,0666)<0){/*返回值:文件描述符,值为一个整数,发生错误时返回-1=><0及创建失败*/
printf("create file %s fail\n",filename);
exit(EXIT_FAILURE);
}else{
printf("create file %s success",filename);
}
}
int main(int argc,char*argv[])/*argc表示命令行总的参数的个数,argv[]表示字符串数组*/
{
if(argc<2){/*argc<2判断有名有传入文件名,没有表示文件没有生成*/
perror("you have not input the filename ,please try again");
exit(EXIT_FAILURE);
}
creat_file(argv[1]);/*argv[0]指向程序的全路径名,argv[1]是指向在DOS命令行中执行程序名后的第一个字符串*/
exit(EXIT_SUCCESS);/*exit只有0是正常退出,其余数字均是异常*/
/*EXIT_FAILURE 可以作为exit()的参数来使用,表示没有成功地执行一个程序。
参EXI用SUCCESS 作为exit()的`
数,表示成功地执行一个程序。*/
}
运行结果:
实例2:
源文件拷贝内容到目标文件
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<errno.h>
#define BUFFER_SIZE 1024
int main(int argc,char *argv[]){
int from_fd,to_fd;
int bytes_read,bytes_write;
char buffer[BUFFER_SIZE];
char *ptr;
if (argc!=3){/*加入argc不等于3则表示创建文件失败,这里有程序本身,from_fd,to_fd三个文件*/
fprintf(stderr,"usage:%s from file to file /n",argv[0]);
/*stderr标准输出设备,stdin标准输入,stdout标准输出*/
exit(1);
}
if((from_fd=open(argv[1],O_RDONLY|O_CREAT))==-1){/*创建失败返回-1*/
fprintf(stderr,"open %s Error:%s/n",argv[1],strerror(errno));
exit(1);
}
if((to_fd=open(argv[2],O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR))==-1){/*创建文件并且允许写,S_IRUSR|S_IWUSR允许文件拥有者读写*/
fprintf(stderr,"open %s Error:%s/n",argv[2],strerror(errno));
exit(1);
}
while(bytes_read=read(from_fd,buffer,BUFFER_SIZE)){/*从文件from_fd读取BUFFER_SIZE个字节长度的文件到buffer,返回实际读到的字节数*/
if((bytes_read==-1)&&(errno!=EINTR)) break;
/*如果read()读到的数据是0,那么就表示文件读完了,如果读的过程中遇到了中断则read()应该返回-1,同时置errno为EINTR*/
else if(bytes_read>0){
ptr=buffer;
while(bytes_write=write(to_fd,buffer,bytes_read)){
/*将bytes_read个字节长度从buffer写入to_fd*/
if ((bytes_write==-1)&&(errno!=EINTR)) break;
else if(bytes_read==bytes_write) break;
else if(bytes_write>0){
ptr+=bytes_write;
bytes_read-=bytes_write;
}
}
if(bytes_write==-1)
break;
}
}
close(from_fd);
close(to_fd);
exit(0);
}
测试结果:
1.编译以上程序得到test
2.新建一个文件s1,里面的内容123
3../test s1 s2
4.查看s2,内容一样,拷贝已经成功
三.库函数访问文件
1.文件的创建和打开
FILE * fopen(const char * filename,const char * mode);
filename表示要打开的文件在操作系统下的名称,这个名称应该包括路径名称
mode:
r 打开只读文件,该文件必须存在。
r+ 打开可读写的文件,该文件必须存在。
w 打开只写文件,若文件存在则文件长度清为0,即该文件内容会消失。若文件不存在则建立该文件。
w+ 打开可读写文件,若文件存在则文件长度清为零,即该文件内容会消失。若文件不存在则建立该文件。
a 以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾,即文件原先的内容会被保留。
a+ 以附加方式打开可读写的文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾后,即文件原先的内容会被保留。
2.读写文件
对二进制文件读写的库函数是fread()和fwrite()
size_t fread(void *ptr, size_t size, size_t n, FILE *stream);
从stream指向的文件中读取n个字段,每个字段为size个字节,并将读取的数据放入ptr所指字符数组中,返回实际已读的字节
size_t fwrite(void *ptr, size_t size, size_t n, FILE *stream);
从缓冲区ptr中将n个字段,每个字段size个字节写入到stream指向的文件中
3.从指定的文件中读取一个字符
int fgetc(FILE *fp);
c=fgetc(fp);从fp指向的文件当前位置读一个字符,并赋给变量c,并使文件指针下移一个字符。如果fp指向文件结束位置,则返回文件结束标志EOF(即为-1)。
int fgetc(FILE *stream)
ch=fgetc(fp);
while(ch!=EOF){/加入这个字符不是结束符/
putchar(ch);
ch=fgetc(fp);
}
4.向指定的文件写入一个字符
int fputc(int ch , FILE *fp);
fputc()函数是将字符ch直接写入句柄fp指向的文件的当前位置,如果出错则返回EOF。
5.格式化字符
int fscanf(FILE *fp, const char *mode, …);
从fp指向的文件中,按mode中指定的格式逐个读取文本数据转换成指定的数据类型,附给对应指针指向的存储单元中。
6.打印输出
int fpintf(FILE *fp, char *mode, …);
fprintf(stderr,”usage:%s from file to file /n”,argv[0]);
7.文件定位
int fseek(FILE *fp, long int offset, int whence);
whence:
SEEK_SET:文件的开始位置;
SEEK_CUR:文件的当前位置;
SEEK_END:文件的结束位置。
8.获取路径
char *getcwd(char *buffer,size_t size)
9.创建目录
int mkdir(char *dir,int mode)
四.时间编程
1.时间类型:格林威治时间和日历时间
2.时间的获取
#include<time.h>
time_t time(time_t *tloc)
获取日历时间,从1970年1月1日0点到现在所经历的秒数
3.时间转换
struct tm *gmtime(const time_t *timep)
将日历时间转化为格林威治时间,保存在tm结构里面
struct tm *localtime(const time_t *timep)
将日历时间转化为本地时间,并保存在tm结构里
4.时间保存
struct tm{…}
int main(void){
struct tm*local;
time_t t;
t=time(Null);
local=localtime(&t);
printf(“local hour is :%d\n”,local->tm_hour);
local=gmtime(&t);
printf(“utc hour is :%d\n”,local->tm_hour);
return 0;
5.时间显示
char *asctime(const struct tm *tm)
将tm格式转化为字符串
char *ctime(const time_t *timep)
将日历时间转化为本地时间的字符串形式
6.获取时间
int gettimeofday(struct timeval *tv,struct timezone *tz)
获取从今日凌晨到现在的时间差,记录事件的执行时间
struct timeval{
int tv_sec;//秒数
int tv_usec;//微秒数
}
7.延时时间
unsigned int sleep(unsigned int seconds)
void usleep(unsigned long usec)