1.复习拷贝文件的流程:
a.打开文件:fopen
b.文件的读写:fgetc/fputc/fgets/fputs
c.关闭文件:fclose
注意:全缓存的缓存区大小为4k,所以定义了一个4096字节的char数组。打开两个目标文件和源文件,定义两个指针指向他们。
1.函数接口:
1.fwrite
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
向流中写入nmemb个对象,每个对象size字节大小,在ptr指向的空间中
参数:
ptr:存放数据空间的首地址
size:每个数据对象的大小
nmemb:数据对象的个数
stream:文件流指针
返回值:
成功返回写入对象的个数
失败返回0
读到文件末尾返回0
2.fread
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
功能:
从流中读取nmemb个对象,每个对象size个字节,存放到ptr指向的空间中
参数:
ptr:存放读取内容空间首地址
size:读取对象的大小
nmemb:读取对象的个数
stream:文件流指针
返回值:
成功返回读到对象个数
失败返回0
读到文件末尾返回0
练习:
1.利用fread和fwrite完成将src.jpg图片内容拷贝到dst.jpg图片中
2.利用fread将bmp照片中的宽和高读出来打印出来
3.fprintf
int fprintf(FILE *stream, const char *format, ...);
功能:
将格式化字符串输出到stream指向的流中
printf
fprintf(stdout, );
4.fsancf
int fscanf(FILE *stream, const char *format, ...);
功能:
从流中读取格式化的字符串
2.流的定位:
1.ftell
long ftell(FILE *stream);
功能:
获得流的偏移量
2.rewind
void rewind(FILE *stream);
功能:
将流的偏移量重新设置到开头
3.fseek
int fseek(FILE *stream, long offset, int whence);
功能:
设置流的偏移量
参数:
stream:文件流指针
offset:偏移量
> 0 向后偏移
< 0 向前偏移
whence:
SEEK_SET 文件开头
SEEK_CUR 文件当前位置
SEEK_END 文件末尾
练习:从终端输入一个单词,获得单词的含义
cpp
int main(void)
{
char s[256]={0}; //定义一个接收查找单词的字符型数组
char tmpbuff[4096]; //定义一个接收词库的字符型数组
char* ptmp = NULL;
char *pret = NULL;
printf("input your find word : ");
scanf("%s",s); //从终端提取查找的单词放在s地址中
FILE* fp = NULL;
fp = fopen("dict.txt","r");
if(NULL == fp)
{
perror("fail to fpoen");
return -1;
}
while(1)
{
pret = fgets(tmpbuff,sizeof(tmpbuff),fp); //提取词库每一行的单词和注释放在tmpbuff
if(pret == 0) //fgets的返回值为0说明无法读取到了
{
break;
}
ptmp = tmpbuff; //让ptmp和tmpbuff的指针初始化在相同的位置
while(*ptmp != ' '&&*ptmp !='\0') //识别到单词后的空格停下
{
ptmp++; //识别不是空格,让ptmp指针不断向后移动
}
*ptmp = '\0'; //识别为空格的地方换成'\0',便于后面比较字符时候可以将\0前面的单词识别为一个字符串
ptmp++;
while(*ptmp == ' ')
{
ptmp++; //让ptmp指针跳过空格的位置,指向注释字符串的第一个字符
}
if(strcmp(s,tmpbuff)==0) //比较单词字符串和查找字符的大小,相等返回值为0,找到!
{
printf("%s",ptmp); //打印出上面找到注释第一个字符的地址ptmp所对应的字符串
fclose(fp);
return 0 ;
}
}
fclose(fp);
printf("单词不存在!\n"); //若是比对不成功,则代表没有这个单词
return 0 ;
}