一、标准IO
1.函数接口补充
(1)fwrite
原型:size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE
*stream);
功能:
向流中写入ptr指向的nmemb个对象,每个对象size个字节
参数:
ptr:指向数据空间的首地址
size:写入的每个对象的大小
nmemb:写入对象的个数
stream:文件流指针
返回值:
成功返回实际写入对象的个数
失败返回0
(2)fread
原型:size_t fread(void *ptr, size_t size, size_t nmemb, FILE
*stream);
功能:
从流中读取nmemb个对象到ptr指向的空间中,每个对象size个字节
参数:
ptr:存放数据空间的首地址
size:读取对象的字节大小
memb:读取对象的个数
stream:文件流指针
返回值:
成功返回读到对象的个数
失败或者读到文件末尾返
e.g.图片拷贝
思路:利用fread和fwrite实现图片的拷贝
#include <stdio.h>
int main(void)
{
FILE *fp1 = NULL;
FILE *fp2 = NULL;
size_t nret = 0;
char tmpbuff[4096] = {0};
fp1 = fopen("jake.jpg", "r");
if(NULL == fp1)
{
perror("fail to fopen");
return -1;
}
fp2 = fopen("jaeyun.jpg", "w");
if(NULL == fp2)
{
perror("fail to fopen");
return -1;
}
while(1)
{
// nret = fread(tmpbuff, sizeof(tmpbuff), 1, fp1); //每次读4096个字节,读一个对象,最后如果不满4096则会导致文件缺失
nret = fread(tmpbuff, 1, sizeof(tmpbuff),fp1);//每次读一个字节,每次最多读4096个对象,避免缺失
if(0 == nret)
{
break;
}
fwrite(tmpbuff, 1, nret, fp2);
}
fclose(fp1);
fclose(fp2);
return 0;
}
2.流的定位:设置流的偏移量
(1)fseek
原型:int fseek(FILE *stream, long offset, int whence);
功能:
设置流的偏移量的标识
参数:
stream:文件流指针
offset:偏移量
> 0 向后偏移
< 0 向前偏移
whence:标识
SEEK_SET 文件开头
SEEK_CUR 当前位置
SEEK_END 文件末尾
返回值:
成功返回0 失败返回-1
(2)ftell
原型:long ftell(FILE *stream);
功能:
获得流的偏移量
参数:
stream:文件流指针
返回值:
成功返回流的偏移
(3)rewind
原型:void rewind(FILE *stream);
功能:
将流重新定位到开
e.g.从bmp文件中读取图片的宽度和高度
思路:bmp格式的宽和高是在文件第18个字节后的8个字节存储的(分别四个字节),通过设置流的偏移量来读取数值
#include <stdio.h>
int main(void)
{
FILE *fp = NULL;
int width = 0;
int height = 0;
fp = fopen("1.bmp", "r");
if(NULL == fp)
{
perror("fail to fopen");
return -1;
}
fseek(fp, 18, SEEK_SET);
fread(&width, sizeof(width), 1, fp);
fread(&height, sizeof(height), 1, fp);
fclose(fp);
printf("宽为%d,高为%d\n", width, height);
return 0;
}
二、文件IO
1.概念
(1)标准IO是有缓存的IO,文件IO没有缓存,适合于通信、硬件设备操作
(2)标准IO是库函数,文件IO是系统调用
(3)系统调用:是Linux内核中的代码,只能在Linux系统中使用
(4)库函数:是对系统调用的封装,可以在不同的操作系统中安装并使用,库函数最终还是要调用系统调用完成对应功能
2.文件IO函数接口
(1)文件打开
原型:
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
功能:
打开文件获得操作文件的文件描述符
参数:
pathname:要打开的文件路径
flags:打开文件的标志,必须包含三者之一
O_RDONLY
O_WRONLY
O_RDWR
O_CREAT 文件不存在创建(注意要给定创建文件的权限)
O_TRUNC 文件存在截断为0(清0)
O_APPEND 追加
O_EXCL 文件存在报错
返回值:
成功返回新文件描述符
失败返回-1
注意:
有三个特殊的文件描述符:标准输入(0)、标准输出(1)、标准错误(2)
文件描述符特点:①非负整数 ②取尚未被占用的最小的非负整数
文件描述符是有上限的,到达上限后再打开会报错误
(2)关闭文件描述符
原型:int close(int fd);
功能:
关闭文件描述
(3)请写出标准IO对应的文件IO的打开方式
| 标准IO | 文件IO |
| r | O_RDONLY |
| r+ | O_RDWR |
| w | O_WRONLY | O_CREAT | O_TRUNC , 0664 |
| w+ | O_RDWR | O_CREAT | O_TRUNC, 0664 |
| a | O_WRONLY | O_APPEND | O_CREAT, 0664 |
| a+ | O_RDWR | O_APPEND | O_CREAT, 066 |

被折叠的 条评论
为什么被折叠?



