嵌入式自学第二十五天(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表示错误。