嵌入式C语言开发 文件IO编程 open/close/read/write/stat/fstat/lstat

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;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值