Mohican_3/30 C语言 文件输入输出 的基本操作fopen fgets fputs strstr EOF

#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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值