系统调用-文件访问
linux下的文件编程:
- 系统调用的方式
- C语言库函数方式- 系统调用方式 -
- 系统调用的方式 -
-
int creat(const char *filename,mode_t mode)
filename:要创建的文件名(包含路径,缺省为当前路径下)
mode: 创建模式
S_IRUSR = 可读 =》4
S_IWUSR = 可写 =》2
S_IXUSR = 可执行 =》1
S_IRWXU = 读写执行 =》7
例子:
读写权限:0110;
可写可执行:0011;
-
int open(const char *pathname, int flags)
int open(const char *pathname,int flags,mode_t mode)
pathname: 要打开的文夹名(文件路径,缺省为当前路径)
flags: 打开标志
O_RDONLY => 只读方式打开
O_WRONLY => 只写方式打开
O_RDWR => 读写方式打开
O_APPEND => 追加方式打开
O_CREAT => 创建方式打开(用方式2,加入mode参数)
O_NOBLOCK => 非阻塞方式打开
例子:fd = open(argv[1],O_CREAT|O_RDWR,0755
-
int close(int fd)
关闭文件,在拿到系统分配的文件标识符后,当作参数传递给close函数,即可关闭对应的已打开文件。
-
int read(int fd,const void *buf,size_t length)
从文件描述符fd所指向的文件中读取length个字节到buf所指向的缓冲区中,返回值为实际读取到的字节数。
fd:指向你所需要阅读文件的文件标识符
buf:缓冲区
length:读取的字节长度
-
int write(int fd,const void *buf,size_t length)
把length个字节从buf指向的缓冲区中写到文件描述符fd所指向的文件当中,返回实际写入的字节数。
fd:要写入的文件对象的标识符
buf:缓冲区
length:要写入的字节数
-
int Iseek(int fd,offset_t offset,int whence)
将文件读写指针 相对whence移动offset个字节。操作成功时,返回指针相对于文件头的位置。
offset: 负数-相对于当前,向 开头偏移; 正数-相对于当前,向 结尾偏移;
-
int access(const char *pathname, int mode)
pathname: 文件名称
mode:要判断的访问权限:
R_OK => 文件可读
W_OK => 文件可写
X_OK => 文件可执行
F_OK => 文件存在
测试的时候,如果有任何一个条件不成立,就返回-1.
- C语言库函数调用方式 -
-
FILE *fopen(const char *filename, const *mode)
filename: 打开的文件名(包含路径,缺省为当前路径)
mode:打开模式
简称 描述 r , rb 只读方式打开 w , wb 只写方式打开,如果文件不存在,则创建文件 a , ab 追加方式打开,如果文件不存在,则创建该文件 r+ , r+b , rb+ 读写方式打开 w+ , w+b , wh+ 读写方式打开,如果文件不存在,则创建文件 a+ , a+b , ab+ 读和追加方式打开,如果文件不存在,则创建该文件 -
size_t fread(void *ptr, size_t size,size_t n,FILE *stream)
从stream所指向的文件中读取n个字段,每个字段为size字节,并将读取的数据放入ptr所指向的字符数组中,返回实际已经读取的字节数(n x size)。
ptr: 存放读取到的字符
size: 每个字段的字节数
n: 要读取的字段数
stream: 要读取得目标文件
-
size_t fwrite(const void *ptr, size_t size,size_t n,FILE *stream)
从缓冲区ptr所指向的数组中把n个字段写到stream所指向的文件中,每个字段长为size个字节,返回实际写入的字节数(n x size)。
-
int fgetc(FILE *stream)
用于读取指定文件stream中的一个字符。
#inlcude <stdio.h> main() { FILE *fp; char ch; if((fp=fopen("file1","rt"))==NULL){ printf("\n Cannnot open file strike any key exit!"); getch(); exit(1); } ch = fgetc(fp); while(ch != EOF){//判断是否结束符 putchar(ch); ch = fgetc(fp); } fclose(fp); }
-
int fputc(int c , FILE *stream)
向指定的文件写入一个字符。
#inlcude <stdio.h> main() { FILE *fp; char ch; if((fp=fopen("file1","wt+"))==NULL){ printf("\n Cannnot open file strike any key exit!"); getch(); exit(1); } printf("input a string:\n"); ch = getchar(); while(ch != '\n'){//判断是否结束符 fputc(ch,fp); ch = getchar(); } printf("\n"); fclose(fp); }
-
int fscanf(FILE *stream, char *format[,argument…])
从一个流中进行格式化输入
#inlcude <stdio.h> #include <stdlib.h> int main(void) { int i; printf("Input an integer: "); if(fscanf(stdin,"%d",&i)) printf("The integer read was: %d\n",i); return 0; }
-
int fprintf(FILE *stream, char *format[,argument…])
格式化输出到一个流中
#include <stdio.h> #include <process.h> FILE *stream; void main(void){ int i=10; double fp = 1.5; char s[]="this is a string!"; cahr c = "\n"; stream = fopen("file1","w"); fprintf(stream,"%s%c",s,c); fprintf(stream,"%d\n",i); fprintf(stream,"%f\n",fp); fclose(stream); }
-
int fseek(FILE *stream, long offset, int whence)
查询文件
whence参数:
SEEK_SET 从文件的开始处开始探索
SEEK_CUR 从当前位置开始搜索
SEEK_END 从文件的结束处开始搜素
offset参数
负数: 向开头方向
正数: 向结尾方向
-
char *getcwd(char *buffer,size_t size)
获取当前路径women提供一个size大小的buffer来存储路径名,如果buffer太小,函数返回 -1
#include <unistd.h> main(){ char buf[80]; getcwd(buf,sizeof(buf)); printf("current working directory: %s\n",buf); }
-
int mkdir(char *dir,int mode)
创建一个目录,0表示成功,-1表示出错。函数:#include<sys/stat.h>
#include <sys/stat.h> int main(char argc, char *argv[]) { int ok = 0; if((ok=mkdir(argv[1],0755)) != 0) { perror("mkdir %s", argv[1]); } return 0; }
时间编程&必修实验
- 时间函数-
函数包含文件:#include<sys/stat.h>
-
time_t time(time_t *tloc)
功能:获取日历时间,即从1970年1月1日0时到现在所经历的秒数。
-
时间转化
struct tm *gmtime(const time_t *timep)
功能:将日历时间转化为格林威治标准时间,并保存到TM
struct tm *localtime(const time_t *timep)
功能:将日历时间转化为本地时间,并保存到TM结构
struct tm{ int tm_sec; //秒 int tm_min; //分 int tm_hour; //时 int tm_mday; //本月第几日 int tm_mon; //本年第几月 int tm_year; //tm_year + 1900 = int tm_wday; //本周第几天 int tm_yday; //本年第几日 int tm_isdst; //日光节约时间 }
实例程序time1.c:
#include <time.h> #include <stdio.h> 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; }
-
时间显示
char *asctime(const struct tm *tm)
功能:将tm格式的时间转化为字符串,如:Sat Jul 30 08:43:03 2005
char *asctime(const time_t *timep)
功能:将日历时间转化为本地时间的字符串形式
实例程序time2.c:
#include <time.h> #include <stdio.h> int main(void){ struct tm *ptr; time_t It; It = time(NULL); ptr = gmtime(&It);//转化成格林威治时间 printf(asctime(ptr));//输出格林威治时间的字符串 printf(ctime(&It));//输出本地时间的字符串 return 0; }
-
获取时间
int gettimeofday(struct timeval *tv,struct timezone *tz)
功能:获取从今天凌晨到现在的时间差,常用于计算时间耗时。
struct timeval{ int tv_sec; //秒数 int tv_usec; //微秒数 }
实例time3.c:
#include <sys/time.h> #include <stdio.h> #include <stdlib.h> #include <math.h> /*算法分析*/ void function() { unsigned int i,j; double y; for(i=0;i<1000;j++){ for(j=0;j<1000;j++){ y++; } } } main() { struct timeval tpstart,tpend; float timeuse; gettimeofday(&tpstart,NULL);//开始时间 function(); gettimeofday(&tpend,NULL);//结束时间 //计算执行时间 timeuse = 1000000*(tpend.tv_sec-tpstart.tv_sec)+tpend.tv_usec-tpstart.tv_usec; timeuse/= 1000000; printf("Used time: %f\n",timeuse); exit(0); }
-
延时函数(delay)
unsigned int sleep(unsigned int seconds)
功能:使得程序睡眠(延时阻塞)seconds秒
void usleep(unsigned long usec)
功能:使得程序睡眠(延时阻塞)usec微秒