嵌入式自学第二十五天(5.21)

(1)二进制文件读写操作:
例:
#include<stdio.h>
int main()
{
    FILE *fp = fopen("a.out","r");
    FILE *fp1 = fopen("app","w");
    if(NULL == fp || NULL == fp1)
    {
        fprintf(stderr, "fopen error");
        return 1;
    }

    char buf[10240];
    if(0 == fread(buf,10240,1,fp))
    {
        fprintf(stderr, "fread error");
        return 1;
    }

    printf("%s\n",buf);
    fwrite(buf,8568,1,fp1);

    fclose(fp);
    return 0;
}
注意:写操作的第二个参数必须是要写入文件的精确大小。
    返回值为0说明读完了,返回值大于零表示读的字节数,返回值-1表示出错
    可以用ll命令查看文件大小
(2)文件定位
例:
#include<stdio.h>
int main()
{
    FILE * fp = fopen("2.txt", "r");
    FILE *fp1 = fopen("1.txt", "w");
    if(NULL == fp)
    {
        fprintf(stderr, "fopen error");
        return 1;
    }

    fseek(fp, 0,SEEK_END);
    long size = ftell(fp);

    printf("%ld\n",size);
    rewind(fp);

    char buf[1024];
    int ret = fread(buf, 1024, 1, fp);
    fwrite(buf, size, 1, fp1);
    printf("%d", ret);
    fclose(fp);
    fclose(fp1);

    return 0;
}
注意:int fseek(文件流,偏移量,起始位置),位置可以为:SEEK_SET头,SEEK_END结尾, SEEK_CRT经过读写后的当前位置。返回值为0偏移成功,-1失败。
    long ftell(fp)返回pos值即当前位置。
    rewind(fp)让pos置零。
(3)缓冲区:是快速设备和慢速设备间的中转站。
行缓冲区:1kb 终端 人机交互stdout
遇到\n刷新、缓冲区满刷新、程序正常结束刷新,fflush刷新  fflush(stdout);

全缓冲区  4k  主要用于文件读写
刷新条件:缓冲区满刷新、程序正常结束刷新,fflush刷新  fflush(fp)

无缓冲区:0k 主要用于处理错误信息输出stderr

(4)系统调用:操作系统自带的函数调用,数据直接传进设备。
(5)系统文件操作函数:open read write close
例:读
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{
  
  int fd = open("1.txt", O_RDONLY);
  if (-1 == fd)
    {
      fprintf(stderr, "open error\n");
      return 1;
    }

  char buf[1024] = {0};
  ssize_t ret = read(fd,buf,sizeof(buf));
  printf("readret:%ld %s\n", ret,buf);
  
  close(fd);

  // system("pause");
  return 0;
}

#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>

int main(int argc, char **argv)
{
  int a = 12312;
  int fd = open("1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0666);
  if (-1 == fd)
    {
      fprintf(stderr, "open error\n");
      return 1;
    }

  char buf[1024] = "hello";
  ssize_t ret = write(fd, buf, strlen(buf));
  printf("write ret:%ld\n", ret);

  close(fd);

  // system("pause");
  return 0;
}


注意:
    文件描述符:用数字代表某个文件流。默认范围是int 0-1023。
0 stdin
1 stdout
2 stderr描述符与流对象。
    系统调用标准头文件 unistd.h。
    文件模式:flags:O_REONLY, O_WRONDY, O_RDWR对应位置1。
O_CREAT创建文件
O_TRUNC清空
    文件操作权限:-rw-rw-r--
-普通文件
d目录
rwx读写执行
rew-读写
linux用户
linux组名
其他人

rw-rw-rw-
0666
umask掩码,用给定权限来减掩码,才是文件操作权限,0664。
    write(文件流,buf,实际大小)
返回写入的字节数,0表示未写入(操作设备时可能未写入),-1表示错

read(文件流,buf,设定长度)
返回读到的字节数,读完后0表示文件读完,-1表示错误。

    
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值