open/close
int fd2;
fd2=open(argv[1],O_RDWR | O_CREAT | O_EXCL,0655);
if(fd2==-1)
{
perror("open file error!");
exit(1);
}
printf("fd2=%d\n",fd2);
int ret=close(fd2);
printf("fd2=%d\n",fd2);
printf("ret=%d\n",ret);
部分代码
O_RDONLY O_WRONLY O_RDWR :只读 只写 读写
O_CREAT :文件不存在就创建
O_APPEND:打开文件时,将文件读写位置移到末尾 == fopen(argv[1],“a+”)
O_EXCEL:判断文件是否已存在,存在则报错
O_TRUNC:打开文件清零文件
O_NONBLOCK:非阻塞的方式打开
read/write
char buffer[1024];
// fgets(stdin,buffer,sizeof(buffer-1));
gets(buffer);
int num=5;
int nw=write(fd2,buffer,strlen(buffer));
if(nw==-1)
{
perror("write error!");
exit(1);
}
printf("weite data len=%d\n",nw);
int file_size=lseek(fd2,0,SEEK_SET);
printf("file-size=%d\n",file_size);
memset(buffer,0,sizeof(buffer));
int nr=read(fd2,buffer,sizeof(buffer));
buffer[nr]='\0';
printf("read data len =%d data = %s\n",nr,buffer);
int ret=close(fd2);
printf("fd2=%d\n",fd2);
printf("ret=%d\n",ret);
strlen和sizeof的区别
区别: 1、sizeof会将空字符0计算在内,而strlen不会将空字符0计算在内; 2、sizeof会计算到字符串最后一个空字符0并结束,而strlen如果遇到第一个空字符0的话就会停止并计算遇到的第一个空字符0前面的长度。
**sizeof()**是运算符,其值在编译时 就已经计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小。实际上,用sizeof来返回类型以及静态分配的对象、结构或数组所占的空间,返回值跟对象、结构、数组所存储的内容没有关系。
**strlen(…)*是函数,要在运行时 才能计算。参数必须是字符型指针(char)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。
该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到遇到结束符’\0’停止。返回的长度大小不包括‘\0’。
stat/fstat/lstat
获取文件的长度:
int file_sizoe = fseek(fd,0,SEEK_END);
//或者
struct stat file1;
//stst(argv[1],&file1);//文件没有打开用这个
fstat(fd2,&file1);//文件打开了用这个
printf("file_size=%d\n",file1.st_size);
完整代码
#include<stdio.h>
#include<sys/types.h>
#include<stdlib.h>
#include<sys/stat.h>
#include<errno.h>
#include<fcntl.h>
#include<unistd.h>
#include<string.h>
int main(int argc,char **argv)
{
if(argc != 2)
{
printf("please input file name!\n");
exit(1);
}
//creat(argv[1],S_IRWXU | S_IRWXG | S_IRWXO);
int fd1;
fd1=creat(argv[1],0644);
if(fd1==-1)
{
/*if(errno==EISDIR)
{
printf("creat file error:filename is dir!\n");
}
else if(errno == EINVAL)//can shu error
{
}
printf("creat file error!\n");*/
perror("creat file error!\n");
exit(1);
}
// printf("creat file error!\n");
//printf("creat file error:%s\n",strerror(errno));
printf("fd1=%d\n",fd1);
int fd2;
fd2=open(argv[1],O_RDWR );
if(fd2==-1)
{
perror("open file error!");
exit(1);
}
printf("fd2=%d\n",fd2);
//int ret=close(fd2);
//printf("fd2=%d\n",fd2);
//printf("ret=%d\n",ret);
char buffer[1024];
// fgets(stdin,buffer,sizeof(buffer-1));
gets(buffer);
int num=5;
int nw=write(fd2,buffer,strlen(buffer));
if(nw==-1)
{
perror("write error!");
exit(1);
}
printf("weite data len=%d\n",nw);
struct stat file1;
//stst(argv[1],&file1);
fstat(fd2,&file1);
printf("file_size=%d\n",file1.st_size);
int file_size=lseek(fd2,0,SEEK_SET);
printf("file-size=%d\n",file_size);
memset(buffer,0,sizeof(buffer));
int nr=read(fd2,buffer,sizeof(buffer));
buffer[nr]='\0';
printf("read data len =%d data = %s\n",nr,buffer);
int ret=close(fd2);
printf("fd2=%d\n",fd2);
printf("ret=%d\n",ret);
return 0;
}