实验题目:使用VS2019将E盘中的文件写入到D盘中
实验要求:暂无
实验环境与工具:VS2019
其他用途:本程序同样适用于linux环境下,将U盘内的文件写入到开发板内的指定路径中(需要提前明确板子上写入的位置是否有权限)
注:
1.C4996 fopen(‘fscanf‘、strcmp):This function or variable may be unsafe. 的解决
右击项目,点击“属性”,打开属性页后,点击“预处理器”,在预处理器定义中添加“_CRT_SECURE_NO_DEPRECATE ”,然后点击确定,再点击应用,最后再确定;
1.流程:
1.1 先判断需写入和待写入的文件是否存在。
1.2 初始化指针的位置。
1.3 每次写入指定大小,直至写完。
2.相关程序:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define PKG_INSTALL_PATH "D:/baidu/BaiduNetdiskDownload/b.txt"
#define PKG_MAX_SIZE 0x1F400000
#define PKG_EACH_WR_SIZE 0x100000
bool bCopyPkg(char* PstPkgPath)
{
bool bRet = false;
long fsize = 0;
long rsize = 0;
long wsize = 0;
long rsizetotal = 0;
void* buffer = NULL;
if (PstPkgPath != NULL)
{
FILE* fpsrc = fopen(PstPkgPath, "r");
if (!fpsrc)
{
printf("open fpsrc fail\n");
return bRet;
}
FILE* fpdest = fopen(PKG_INSTALL_PATH, "wb+");
if (!fpdest)
{
printf("open fpdest fail\n");
return bRet;
}
if (0 == fseek(fpsrc, 0, SEEK_END))
{
fsize = ftell(fpsrc);
printf("file fsize :%d\n", fsize);
if (fsize > PKG_MAX_SIZE)
{
fclose(fpsrc);
fclose(fpdest);
printf("oversize\n");
return bRet;
}
buffer = malloc(PKG_EACH_WR_SIZE);
if (buffer)
{
fseek(fpsrc, 0, SEEK_SET);
while (rsizetotal < fsize)
{
memset(buffer, 0, PKG_EACH_WR_SIZE);
rsize = fread(buffer, 1, PKG_EACH_WR_SIZE, fpsrc);
wsize = fwrite(buffer, 1, rsize, fpdest);
rsizetotal += rsize;
if ((wsize != rsize) || (0 == rsize))
{
printf("write failed\n");
break;
}
}
if (0 == fseek(fpdest, 0, SEEK_END))
{
if (fsize == ftell(fpdest))
{
printf("copy file succeed\n");
bRet = true;
}
}
free(buffer);
}
else
{
printf("malloc buffer error\n");
}
}
else
{
printf("fseek fail\n");
}
fclose(fpsrc);
fclose(fpdest);
}
else
{
printf("PstPkgPath == NULL\n");
}
return bRet;
}
int main()
{
char path_buf[128] = "E:/vs2019/source/second_test/second_test/a.txt";
bCopyPkg(path_buf);
return 0;
}
3.VS下的实验结果
4.API调用说明
4.1 fopen(),若文件不存在,会自动创建。
4.2 调用fseek(fpsrc,0,SEEK_END)
4.3 调用 fsize=ftell(fpsrc) 判断需要写入文件的容量
int fseek(FILE *stream, long int offset, int whence)
//fp为文件指针
//SEEK_END为文件结尾
//文件指针定位到文件末尾,偏移0个字节
//成功时为0,否则为非零
4.4 申请每次需要写入的内存大小,并初始化为0
buffer = malloc(PKG_EACH_WR_SIZE); --->PKG_EACH_WR_SIZE 0x100000 --->1MB
4.5 从E盘中每次读取a.txt文件的1MB的数据,然后写入到 D盘中的b.txt,直至写入完成:
rsize = fread(buffer, 1, PKG_EACH_WR_SIZE, fpsrc);
wsize = fwrite(buffer, 1, rsize, fpdest);
函数说明:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr -- 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size -- 这是要读取的每个元素的大小,以字节为单位。
nmemb -- 这是元素的个数,每个元素的大小为 size 字节。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
返回值:成功读取/写入的记录总数。如果总数与nmemb参数不同,**则可能发生了一个错误或者到达了文件末尾**。
4.6 关闭文件:
fclose(fpsrc);
fclose(fpdest);