#include<stdlib.h>
#include<stdio.h>
#include<string.h>
//1.如果以写的方式打开一个文件,如果文件存在,清空文件之前的内容,再写入。
void show1()
{
FILE *fp1 = fopen("F:\\小石潭记.txt","w");
fputc('q',fp1);
}
//2.如果以写的方式打开一个文件,如果文件不存在,先创建该文件,再写入。
void show2()
{
FILE *fp2 = fopen("F:\\show2.txt","w");
fputc('love',fp2); //缓存区 所以只能放入最后一个字符 e
}
//3.EOF标志 把大写变成小写
//1.先读文件 r 2.创建新文件 w 3.EOF判断 是否结束 getc while循环进行替换 4. putc
//#define EOF (-1)
void show3()
{
FILE*fr=fopen("F:\\Let her go.txt","r");//fr指向源文件
FILE*fw=fopen("F:\\Let her go_new.txt","w");//fw指向新文件
char fch;
while( (fch= fgetc(fr) )!= EOF) //注意优先级
{
if( fch >= 'A' && fch <= 'Z')
{
fch += 'a' - 'A';
}
fputc(fch,fw);
}
}
//4.1读写一个mp3.文件 二进制
void show4()
{
FILE *fr = fopen("F:\\Roar.mp3","rb");
FILE *fw = fopen("F:\\Roar_new.mp3","wb");
int ch;
while((ch = fgetc(fr)) != EOF)
{
fputc(ch,fw);
}
}
//4.2 高端版本
void show9 ( )
{
const char * src = "F:\\Roar.mp3";
const char * dst = "F:\\Roar_new2.mp3";
char buffer[1024];
FILE* fr = fopen(src, "rb");
FILE* fw = fopen(dst, "wb");
int read_length = 0;
do {
read_length = fread(buffer, 1, 1024, fr);
fwrite(buffer, 1024, 1, fw);
}while(read_length == 1024);
fclose(fr);
fclose(fw);
}
//5.读写一个mp4文件,两种方式 (1,1024)
void show5() //占用比实际内存多
{
FILE *fr = fopen("F:\\银翼杀手.mp4","rb");
FILE *fw = fopen("F:\\银翼杀手_new.mp4","wb");
char *buffer = (char *)malloc(1024*1024*500 * sizeof(char));
while (fread(buffer,1,1024*1024*500,fr) != 0)
{
fwrite(buffer,1,1024*1024*500,fw);
}
int res;
while ((res = fread(buffer,1,1024*1024*500,fr)) != 0)
{
fwrite(buffer,1,res,fw);
}
}
//.读写一个mp4文件,两种方式 (1024,1)
//1.读取(二进制) 2.写 3.定义 动态分配内存 4.判断 写入
//比实际空间少
void show10 ()
{
FILE *fr = fopen("F:\\银翼杀手.mp4","rb");
FILE *fw = fopen("F:\\银翼杀手_new.mp4","wb");
char *buffer = (char *)malloc(1024*1024*500 * sizeof(char));
while (fread(buffer,1024*1024*500,1,fr) != 0)
{
fwrite(buffer,1024*1024*500,1,fw);
}
int res;
while ((res = fread(buffer,1024*1024*500,1,fr)) != 0)
{
fwrite(buffer,res,1,fw);
}
}
//6.读取一个txt文件,筛选信息(模糊筛选,精确筛选)
void show6()
{
FILE*fr3 = fopen("F:\\示例名单.txt","r");
char string[100] ;
while((fgets(string,101,fr3)) !=NULL)
{
if(strstr(string,"1996") != NULL )
{
printf("%s\n",string);
}
}
}
//7.把一个mp4文件拆分成三份
//1.先定义源文件指针 和 分割后文件指针
//2.分割的数目 文件长度
//3.判断
//4.拆分成三份 (拆分标志是什么?)
void show7_cut() //指针 注意for循环中传参 如果没有按fq[i]会error。 copy后为0kb
{
int res;
FILE *fp=fopen("F:\\银翼杀手.mp4","rb");
FILE *fq[3];
fq[0]=fopen("F:\\银翼杀手1.mp4","wb");
fq[1]=fopen("F:\\银翼杀手2.mp4","wb");
fq[2]=fopen("F:\\银翼杀手3.mp4","wb");
char *buffer = (char *)malloc((1024*1024*10)*sizeof(char));
for(int i =0;i< 3;i++)
{
res = fread(buffer,1,1024*1024*10,fp);
fwrite(buffer,1,res,fq[i]); //注意此处传参 fq[i] 数组
}
//fclose(fp); //switch函数的做法 仅作参考
//FILE *fq;
//int n=1;
//int res;
/*char *buffer=(char *)malloc(sizeof(char)*1024*1024*10);
while((res=fread(buffer,1,1024*1024*10,fp))!=0)
{
switch(n)
{
case 1:fq=fopen("F:\\银翼杀手1.mp4","wb");break;
case 2:fq=fopen("F:\\银翼杀手2.mp4","wb");break;
case 3:fq=fopen("F:\\银翼杀手3.mp4","wb");break;
}
fwrite(buffer,1,res,fq);
n++;
fclose(fq);}*/
}
//8.把拆分后的mp4文件再合并
void show8_get() //数组
{
FILE * fp[3];
fp[0]= fopen("F:\\银翼杀手1.mp4","rb");
fp[1] = fopen("F:\\银翼杀手2.mp4","rb");
fp[2]= fopen("F:\\银翼杀手3.mp4","rb");
FILE*fq=fopen("F:\\银翼杀手_new.mp4","wb");
char *buffer = (char *)malloc((1024*1024*10)*sizeof(char));
int res;
for(int i =0;i< 3;i++)
{
res = fread(buffer,1,1024*1024*10,fp[i]);
fwrite(buffer,1,res,fq);
}
//fclose(fq);
}
int main()
{
// show1() ;
// show2();
//show3();
//show4();
//show9();
//show5();
//show10();
//show6();
//show7_cut();
// show8_get();
getchar();
return 0;
}
文件的分割 --复杂版本
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
// const char * src = "G:\\BaiduNetdiskDownload\\Loving.Vincent.mp4";
// const char * dst_1 = "G:\\BaiduNetdiskDownload\\Vincent-1.mp4";
// const char * dst_2 = "G:\\BaiduNetdiskDownload\\Vincent-2.mp4";
// const char * dst_3 = "G:\\BaiduNetdiskDownload\\Vincent-3.mp4";
void writein(FILE* fp_src, FILE* fp_dst, size_t KB_num){
static char buffer[1024];
int read_len = 0;
printf("Begin to write: [%p] -> [%p]\n", fp_src, fp_dst);
int hundred_M = 0;
if (fp_src)
{
for (int i = 0; i < KB_num ; i++)
{
read_len = fread(buffer, 1, 1024, fp_src);
fwrite(buffer, read_len, 1, fp_dst);
if (1024 != read_len)
{
printf("The src file's content has been read out!\n");
break;
}
if (i % (100 * 1024) == 0){
printf("%d hundred million bytes readed!\n", hundred_M++);
}
}
} else {
printf("The src file can not be opened!\n");
}
fclose(fp_dst);
}
int main(void)
{
// 确定源文件
char src[100];
printf("Please input the origin file's location(simple drag file here): ");
scanf("%[^\n]s", src);
char dst_1[100];
char dst_2[100];;
char dst_3[100];
strcpy(dst_1, src);
strcpy(dst_2, src);
strcpy(dst_3, src);
strcat(dst_1, ".copy-1.mp4");
strcat(dst_2, ".copy-2.mp4");
strcat(dst_3, ".copy-3.mp4");
// source file pointer
FILE * fp_src = fopen(src, "rb");
// destiny file pointer
FILE * fp_dst1 = fopen(dst_1, "wb");
FILE * fp_dst2 = fopen(dst_2, "wb");
FILE * fp_dst3 = fopen(dst_3, "wb");
writein(fp_src, fp_dst1, 1024 * 1024);
writein(fp_src, fp_dst2, 1024 * 1024);
writein(fp_src, fp_dst3, 1024 * 1024 * 2);
fclose(fp_dst1);
fclose(fp_dst2);
fclose(fp_dst3);
fclose(fp_src);
return EXIT_SUCCESS;
}
部分知识回顾:
1.存储形式
字符 ---ASCII存储
数值型数据 --- 二进制 ASCII 都OK
2.文件缓冲区
从内存输出数据 先从到内存的缓冲区中 等到装满缓冲区才一起送到磁盘中去
3.文件类型指针
每个被使用的文件都在内存开辟一个相应的文件信息区 用来存放有关信息
这些信息保存在一个结构体变量中
FILE 结构体 声明信息保存在 stdio中
FILE*fp 指针变量
一般情况
1.fopen ("文件名","打开方式")
2.用二进制的方式读写数据
fread (buffer,size,count,fp)
fwrite (buffer,size,count,fp)
buffer 地址 存放从文件读入的数据的存储区的地址
3.fgetc ("字符","指针变量") // 一次只能一个
fgets (str,n,fp) 从fp指向的文件读入一个长度为n-1的字符串,(最后加一个 '\0'字符)存放在字符数组str中
4.fputs(str,fp) 把str所指向的字符串写到文件指针变量fp所指向的文件中
5.fseek 改变文件 标记位置
fseek(文件类型指针,位移量,起始点 ) 0---开始 1---当前 2----末尾
fseek(fp,100L,0) //文件标记移到距离文件开始100个字节处
ftell 测定文件位置标记的当前位置
6.strstr
strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。
如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。
search若是数字,所搜索的将是该数字(作为ASCII码)代表的字符。
对大小写敏感。如果需要大小写不敏感的,用stristr
7.EOF 文件结束符
8.程序
A.打开一个二进制文件 :输出 行
B.读写一个二位进制文件 :大写换成小写
C.读写一个mp3,文件。
D.读写一个mp4文件,两种方式(1024,1) (1,1024)
E.读取一个txt文件,筛选信息(模糊筛选,精确筛选)
F.合并拆分:
1.类比游戏文件过大(作业)
2.预习C和指针 2345