作业分析讲解,复习
=======================
1. 常见的排序算法,网上搜,理解并能写出代码
内存映射
==========
1. 目前写的显示图像的代码--》write写入像素点到lcd中(效率低)
2. 内存映射--》得到硬件设备的地址(可以模仿单片机操作,直接往硬件地址中赋值即可)
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
返回值:成功 映射得到的硬件设备的首地址 失败 NULL
参数:addr ---》一般设置为NULL,表示由操作系统自动给我分配硬件的首地址
length ---》你打算映射多大的内存空间,字节
prot ---》设置映射的内存区域读写的权限
PROT_READ //可读
PROT_WRITE //可写
flags ---》设置映射的内存区域能否被共享
MAP_SHARED //可以共享
MAP_PRIVATE //不共享
fd ---》你要映射的硬件设备的文件描述符
offset ---》一般设置为0
int munmap(void *addr, size_t length); //解除映射
参数:addr ---》你刚才映射得到的硬件首地址
length ---》你映射得到的地址大小
标准IO
=======================================
区别系统IO和标准IO
区别一: 系统IO用文件描述符来表示不同的文件
标准IO用FILE指针表示不同的文件
1. 相关的接口函数
(1)文件的打开
FILE *fopen(const char *path, const char *mode);
返回值:成功返回FILE指针指向打开的文件 失败 -1
参数:path --》你要打开的文件路径名
mode --》r(以只读的方式打开文件) r+ (可读写) w (只写,文件不存在就新建,存在就清空覆盖) w+(可读写,文件不存在就新建,存在就覆盖) a (只写,文件不存在就新建,存在就直接打开 ) a+(可读写,文件不存在就新建,存在就直接打开)
(2) 文件的读写
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
按数据块读取数据 read(fd, buf,100) fread(buf,2,50);
返回值:成功返回读取到完整的数据块个数 失败 -1
参数: ptr --》保存读取的内容
size --》每个数据块的大小
nmemb --》你打算读取几个数据块
stream --》 你要读取的那个文件
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
返回值:nmemb参数是多少,返回值就是多少,根本不考虑ptr参数中数据是否足够
参见例子
(3) 文件的关闭
int fclose(FILE *stream);
(4) perror()和linux中错误码
作用:详细分析linux中函数错误的具体原因
比如: 打开文件失败的原因??
文件不存在,名字写错了
权限不够
#include <errno.h>
void perror(const char *s);
参数:s ---》打印字符串
原理:linux内核中把所有linux中支持的函数能够出现的错误定义成了宏定义
把各种出错的原因用数字编了号(这些数字称之为错误码)
linux定义了全局变量 int errno用来保存错误码(一旦函数出错了,系统会自动更新errno的值)
#define 文件不存在 1
#define 权限不够 2
#define 文件名字太长 3
常见错误码:
#define EPERM 1 /* Operation not permitted */
#define ENOENT 2 /* No such file or directory */
#define ESRCH 3 /* No such process */
#define EINTR 4 /* Interrupted system call */
#define EIO 5 /* I/O error */
#define ENXIO 6 /* No such device or address */
#define E2BIG 7 /* Argument list too long */
#define ENOEXEC 8 /* Exec format error */
#define EBADF 9 /* Bad file number */
#define ECHILD 10 /* No child processes */
#define EAGAIN 11 /* Try again */
#define ENOMEM 12 /* Out of memory */
#define EACCES 13 /* Permission denied */
#define EFAULT 14 /* Bad address */
#define ENOTBLK 15 /* Block device required */
#define EBUSY 16 /* Device or resource busy */
#define EEXIST 17 /* File exists */
#define EXDEV 18 /* Cross-device link */
#define ENODEV 19 /* No such device */
#define ENOTDIR 20 /* Not a directory */
#define EISDIR 21 /* Is a directory */
(5) fgets() fputs() fgetc() fputc()
int fgetc(FILE *stream); //从stream指向的文件中读取一个字节的数据
按字符读取
返回值:读取的那个字符的ASCII码值
int fputc(int c, FILE *stream);
把c对应的字符写入到stream指向的文件中
char *fgets(char *s, int size, FILE *stream); //从stream指向的文件中读取size字节的数据,存放到指针s中
按行读取
返回值: 读取到的数据的首地址
int fputs(const char *s, FILE *stream);
把s对应的字符串写入到stream指向的文件中
int getc(FILE *stream); //从stream指向的文件中读取一个字节的数据
int putc(int c, FILE *stream);
把c对应的字符写入到stream指向的文件中
练习:
1. 自己研究fwrite规律是否跟fread一样(返回值 )
a和a+的使用
2. 用fread和fwrite实现拷贝文件
总结: 拷贝文件无非两种思路
思路一:一口气读写文件,不用循环 (只适合拷贝小文件)
思路二:分段拷贝文件,分段读写,用循环(大小文件都行)
作业:
1. 查询并理解常用的排序算法 快速排序 堆排序 选择排序
二分查找
2. open read write
失败: 文件不存在 通过错误码errno去判断出错的原因并处理
权限不够
fd=open()
if(fd==-1)
{
if(errno==???) //查询错误原因,补救
}
3. 使用fgetc和fputc配合实现文件读写拷贝
fgets和fputs配合实现文件读写拷贝