目录
前言
c语言的文件操作内容比较繁琐,如果只看代码不上机的话就没办法有效掌握。最近我在线观看学习视频,我就突发灵感,想到可以通过下载流式媒体文件并进行合并来熟悉文件操作。
一、操作环境
win11家庭中文版和vs2022
二、操作步骤
1.登录学习页面
2.按F12,打开开发人员工具窗口
3.按下ctrl+R,记录页面活动,然后点击Fetch/XHR
4.在下面的列表中,找到扩展名为m3u8的文件,右击->copy->copy link address
5.粘贴到记事本里面观察
可以发现它的完整路径是https://r1-ndr.ykt.cbern.com.cn/edu_product/78/video/76b578c33eca409e850c294a4b25273e/3a3d0d00cf4057722d63668579b3f696.1280.720.false/3a3d0d00cf4057722d63668579b3f696.1280.720.m3u8记住这个文件所在的网页文件夹,后面要用到。
6.在第4步的列表中对那个m3u8再右击,选open in new tab,把那个文件下载下来,之后用记事本打开观察
可以看到里面列举了很多ts文件,而且文件名长度都是50个字符。
7.在vs中建立空项目copy,将这个m3u8文件复制到与项目文件copy.vcxproj同一文件夹下,比如 D:\实验室\copy\copy ,注意有两个copy
8.按图示添加源文件
9.编写程序代码
a)下载.c
#include<stdio.h>
#include<string.h>
#include<stdlib.h>//此程序必须在win10/11上运行,否则需要安装curl!
#pragma warning(disable:4996)
extern void download()//下载所有的ts文件
{
FILE* fp = fopen("3a3d0d00cf4057722d63668579b3f696.1280.720.m3u8", "r");
char name[51];//待下载的文件名
char cmd[500];//待调用的命令行
while (fscanf(fp, "%s", name) != EOF)
if (strlen(name) == 50)//文件名长度刚好都一样
{
sprintf(cmd, "curl https://r1-ndr.ykt.cbern.com.cn/edu_product/78/video/76b578c33eca409e850c294a4b25273e/3a3d0d00cf4057722d63668579b3f696.1280.720.false/%s -o .\\%s", name, name);//组装调用curl下载文件的命令
system(cmd);//执行命令
}
fclose(fp);
}
b)合并.c
#include<stdio.h>
#include<string.h>
#pragma warning(disable:4996)
extern void merge()//合并ts文件
{
FILE* fpM = fopen("merge.ts", "wb+");
FILE* fp = fopen("3a3d0d00cf4057722d63668579b3f696.1280.720.m3u8", "r");
FILE* temp = NULL;
char name[51];
while (fscanf(fp, "%s", name) != EOF)
if (strlen(name) == 50)//文件名长度刚好都一样
{
temp = fopen(name, "rb");
char ch = fgetc(temp);
while (!feof(temp))
{
fputc(ch, fpM);
ch = fgetc(temp);//最后一次执行此行,文件读不出,ch仍然是上一次的值,之后feof(temp)成立
}
}
fclose(fpM);
fclose(fp);
fclose(temp);
}
10.执行程序
在 入口.c 中编写如下代码:
main()
{
download();
merge();
}
然后按工具栏上的“本地windows调试器”按钮执行。
耐心等待一会儿,然后到 D:\实验室\copy\copy 下提取merge.ts即可。
说明
1.今天并不研究使用纯粹的c语言下载文件,所以下载文件的时候调用了系统自带的curl命令。
2.不难看出其中用到的文本文件读写和二进制文件读写的过程。