E盘内文件写入D盘/U盘内文件写入开发板

实验题目:使用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);
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值