嵌入式学习-IO进程-Day02
标准IO函数接口
fread,fwrite
文件指针偏移函数
文件IO
概念
文件IO的特点
文件描述符
文件IO的函数接口
open 打开文件
close 关闭文件
read 读函数
write 写函数
lseek 移动文件指针
标准IO和文件IO对比
目录操作函数
opendir 打开目录
closedir关闭目录流
readdir读取目录中的内容
chdir修改当前所处路径
标准IO函数接口
fread,fwrite
 #include <stdio.h>
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:以指定类型从文件中读取内容
参数: ptr:读内容存放的首地址
       size:读一个元素内容的字节大小
       nmemb:读元素的个数
       stream:流(文件)
返回值:成功:元素个数,读到文件结尾0.
     失败:-1size_t fwrite(const void *ptr, size_t size, size_t nmemb,
                     FILE *stream);
功能:以指定类型向文件中写内容
参数:
   ptr:写内容存放的首地址
    size:写一个元素内容的字节大小
    nmemb:写元素的个数
    stream:流(文件)
返回值:成功:写元素个数.
     失败:-1
示例代码:将一个int类型的数组写到文件中保存起来,并且读出来

文件指针偏移函数
rewind
	     void rewind(FILE *stream);
         功能:将文件指针定位到文件开头ftell
	    long ftell(FILE *stream);
		功能:计算文件指针当前的位置(相对于文件开头)
		返回值:成功:文件指针的位置
		        失败:-1,更新errno
fseek
       	int fseek(FILE *stream, long offset, int whence);
		功能:将文件指针偏移到指定位置
		参数:
		    stream:流指针
			offset:偏移量   +5 --》相对于位置向后偏移5byte
			                 -5 --》相对于位置向前偏移5byte
			whence:相对位置
			   SEEK_SET:开头
			   SEEK_CUR:当前
			   SEEK_END:结尾
		返回值:成功:0
		    失败:-1,更新errno
用法:
fseek(fp,+5,SEEK_SET)

文件IO
概念
内核向上提供的输出输出函数接口,叫做系统调用函数接口。基于内核,内核不同,系统调用函数接口不同,文件IO不同操作系统函数接口不通用。可移植性较差。
文件IO的特点

- 没有缓存机制,每次调用都会引起系统调用。
- 围绕文件描述符进行操作,文件描述符都是非负的整数,依次进行分配。
- 文件IO默认打开三个文件描述符,0(标准输入),1(标准输出),2(标准错误)
- 可以操作除了目录文件外的任意类型的文件。
文件描述符
文件描述符都是非负的整数,取值范围(0-1023),最多产生1024个文件描述符,文件描述符被分配的时候是连续的。关闭文件描述符之后才可以提供给其他文件使用。
文件IO的函数接口
open 打开文件
int open(const char *pathname, int flags);
功能:打开文件
参数:pathname:文件路径名
      flags:打开文件的方式
            O_RDONLY:只读
            O_WRONLY:只写
            O_RDWR:可读可写
            O_CREAT:创建
            O_TRUNC:清 空
            O_APPEND:追加   
返回值:成功:文件描述符
        失败:-1
r:O_RDONLY
r+:O_RDWR
w: O_WRONLY | O_CREAT | O_TRUNC ,0666
w+:O_RDWR | O_CREAT | O_TRUNC ,0666
a: O_WRONLY | O_APPEND |  O_CREAT ,0666
a+:O_RDWR | O_APPEND |  O_CREAT ,0666

当文件的打开方式里有O_CREAT创建时,需要函数
int open(const char *pathname, int flags, mode_t mode);
mode:创建文件的权限,只有打开方式当中包含O_CREAT才填充
创建的文件实际的权限位mode & ~umaskumask是权限掩码,值为0002,mode 0666,创建文件的实际权限 0664
umask权限掩码修改命令:umask 0000
修改权限掩码让mode与输入的权限保持一致
close 关闭文件
 #include <unistd.h>
 int close(int fd);
 功能:关闭文件
read 读函数
#include <unistd.h>
ssize_t read(int fd, void *buf, size_t count);
功能:读文件
参数:fd:文件描述符
      buf:存放内容的首地址
      count:期待读取字符的个数
返回值:成功实际读到字符的个数,读到文件结尾返回0
        失败返回-1,更新errno使用read函数时需要注意:read读文件,一般期待读多少字符就是读多少,不会自动补’\0‘,遇到\n也不会自动停止读取,会继续读下一行的内容。
'\0'需要自己补充,考虑预留一个字节补'\0'使用技巧:
1.通过返回值作为实际读到的字符个数,后面补‘\0’;
        char buf[32];
        ret = read(fd,buf,31);
        buf[ret] = '\0';
2.每次读内容放到数组之前先清空数组。
清空数组的函数:memset bzero
memset:
#include <string.h>
void *memset(void *s, int c, size_t n);
功能:清空数组
参数:void *s:数组的首地址
   int c :一般写0size_t n:清空的字节数bzero:
#include <strings.h>
void bzero(void *s, size_t n);
功能:清空数组
参数:void *s:数组的首地址
    size_t n:清空的字节数
write 写函数
#include <unistd.h>
ssize_t write(int fd, const void *buf, size_t count);
功能:写文件
参数:
    fd:文件描述符
    buf:写内容存放的首地址
    count:期待写字符的个数
返回值:成功实际写字符的个数
    失败返回-1,更新errno用法:
ret = read(fd,buf,sizeof(buf));
write(fd,buf,ret)练习:利用read和write函数实现cp功能。

lseek 移动文件指针
#include <sys/types.h>
#include <unistd.h>
       off_t lseek(int fd, off_t offset, int whence);
	   功能:将文件指针移动到指定位置
	   参数:
	       fd:文件描述符
		   offset:偏移量  +向后 -向前
		   whence:相对位置
		       SEEK_SET:开头
			   SEEK_CUR:当前
			   SEEK_END:结尾
	返回值:成功:当前位置(基于文件开头)
	        失败:-1,更新errno用法:
定位到开头
lseek(fd,0,SEEK_SET)标准IO和文件IO对比
| 标准IO | 文件IO | |
| 概念 | c库中定义的一组用于输入输出的函数接口 | 系统中定义的一组用于输入输出的函数接口 | 
| 特点 | 
 | 
 | 
| 函数: | 打开文件:fopen 关闭文件:fclose 读写操作:fgetc fputc fputs fgets fread fwrite 定位操作:fseek rewind ftell 时间:time localtime 其他:fflush fprintf perror | 打开文件:open 关闭文件:close 读写操作:read write 定位操作:lseek | 
目录操作函数
opendir 打开目录
#include <sys/types.h>
#include <dirent.h>
DIR *opendir(const char *name);
功能:打开目录文件
参数:name:文件名
返回值:成功返回目录流指针
        失败返回NULL示例代码
DIR *dirp = opendir("./");
    if (dirp == NULL)
    {
        perror("opendir err\n");
        return -1;
    }
closedir关闭目录流
#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
功能:关闭目录
   参数:dirp:目录流指针
   返回值:成功0,失败-1,更新errno
readdir读取目录中的内容
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
功能:读取目录中的内容
参数:dirp:目录流指针
返回值:成功返回结构体指针,读到结尾返回NULL
    失败返回NULL,更新errnostruct dirent {
           ino_t      d_ino;       /* 文件的inode号 */
           off_t      d_off;       /* Not an offset; see below */
       unsigned short d_reclen;    /* Length of this record */
unsigned char  d_type;      /* 文件类型,但不是所有的都支持                                          
       char           d_name[256]; /*文件名 */
           };
练习:实现ls功能

chdir修改当前所处路径
#include <unistd.h>
 int chdir(const char *path);功能:修改文件路径参数:修改改的路径返回值:成功返回0        失败返回-1,更新错误码
