C++ _块类型是有效的(pHead->;nBlockUse)C++;文件

C++ _块类型是有效的(pHead->;nBlockUse)C++;文件,c++,C++,我知道有好几篇关于这个错误的帖子,但都是针对具体案例的。 我正在制作一个文件拆分/合并器,它具有以下要求: -用户必须输入文件名/输入路径和输出文件夹。 我编写了split函数,其基本部分是将原始文件拆分为N个部分(用户必须输入),一切都很好。 然后我对函数进行了一些修改,以满足“输出文件夹”的要求,然后当我运行程序时,出现了错误(尽管已成功构建)。 有人能解释/澄清我在代码中做错了什么吗?我仍然是处理文件/内存泄漏的新手,因此非常感谢所有帮助/批评 char *GetFileName(char

我知道有好几篇关于这个错误的帖子,但都是针对具体案例的。 我正在制作一个文件拆分/合并器,它具有以下要求: -用户必须输入文件名/输入路径和输出文件夹。 我编写了split函数,其基本部分是将原始文件拆分为N个部分(用户必须输入),一切都很好。 然后我对函数进行了一些修改,以满足“输出文件夹”的要求,然后当我运行程序时,出现了错误(尽管已成功构建)。 有人能解释/澄清我在代码中做错了什么吗?我仍然是处理文件/内存泄漏的新手,因此非常感谢所有帮助/批评

char *GetFileName(char *path)
{
    char *filename = strrchr(path, '\\');
    if (filename == NULL)
        filename = path;
    else
        filename++;
    return filename;
}

void split_F(const char* file_name, const char* output_folder, int number_of_part)
{
    FILE *fp_read = fopen(file_name, "rb");

    //calculate file size
    int file_size;
    fseek(fp_read, 0L, SEEK_END);
    file_size = ftell(fp_read);
    rewind(fp_read); //reset file pointer

    //calculate number of parts
    long size_of_part;
    size_of_part = (int)ceil((double)file_size / number_of_part);
    cout << "Total files after split: " << number_of_part << endl
        << "...Processing..." << endl;


    //extract file name
    char *first_part = new char[255];
    char *temp = new char[255];
    strcpy(temp, file_name);
    first_part = GetFileName(temp);
    cout << endl << "File name is: " << first_part;


    //main process
    char* name = new char[255];
    strcpy(name, output_folder);
    int bytesRemaining = file_size;

    //create buffer
    char *buffer = new char[size_of_part];

    for (int count = 1; count <= number_of_part; count++)
    {

        sprintf(name, "%s.part_%03d", first_part, count);  //attach file name to output directory

        FILE *fp_write = fopen(name, "wb");

        long partSize;
        if (bytesRemaining > size_of_part)
        {
            partSize = size_of_part;
        }
        else
        {
            partSize = bytesRemaining;
        }

        fread(buffer, partSize, 1, fp_read);
        fwrite(buffer, partSize, 1, fp_write);

        cout << "> File: " << name << " done babe!" << endl;

        fclose(fp_write);
    }
    fclose(fp_read);

    delete[] buffer;
    delete[] name;
    delete[] temp;
    delete[] first_part;
}
char*GetFileName(char*path)
{
char*filename=strrchr(路径“\\”);
如果(文件名==NULL)
文件名=路径;
其他的
文件名++;
返回文件名;
}
无效拆分(常量字符*文件名,常量字符*输出文件夹,整数部分)
{
文件*fp_read=fopen(文件名,“rb”);
//计算文件大小
int文件大小;
fseek(fp_read,0L,SEEK_END);
文件大小=ftell(fp\u读取);
倒带(fp_读取);//重置文件指针
//计算零件数量
_零件的长尺寸_;
部分的大小=(int)ceil((双)文件大小/部分的数量);
首先,代码有很多问题,都是因为使用C风格编码而不是使用C++。相反,如果你使用了<代码> STD::String 和C++流,很多问题将自行解决。
第一个问题是,您从未检查该文件是否存在:

FILE *fp_read = fopen(file_name, "rb");
如果
fp\u read
为空,则您从未检查它,并且您的代码继续运行,就好像没有任何错误。这是不正确的

然后在代码中执行以下操作:

  FILE *fp_write = fopen(name, "wb");
同样,如果
fp\u write
可以为空,则不检查它是否正常


但是我们假设
fp_read
fp_write
不为空

//extract file name
char *first_part = new char[255];
char *temp = new char[255];
strcpy(temp, file_name);
以上有两个潜在问题

第一个问题是,您没有进行检查以确保
文件名
少于255个字符。如果
文件名
大于预期值,则在调用
strcpy
时会发生内存覆盖。请使用
strncpy
memcpy
声明要复制的字符数

第二个问题更微妙,那就是您调用了两次
new[]
。如果对
new[]
的第二次调用引发了异常,该怎么办?您将如何取消对
new[]
的第一次调用?您不能。此外,由于引发了异常,您的输入文件仍将被打开

这就是为什么在这些情况下应该使用流的
std::string
ifstream
的原因。如果函数出于任何原因返回,这些类型会自动释放分配的任何资源。使用
C
样式字符串和I/O会使您容易泄漏

同样的问题:

//main process
char* name = new char[255];
strcpy(name, output_folder);
int bytesRemaining = file_size;

//create buffer
char *buffer = new char[size_of_part];
所有这些对
new[]
的调用都可能引发
抛出
,从而留下此函数,并导致内存泄漏和打开文件句柄


另一个问题是,您需要确保您的
缓冲区不会溢出。此代码:

    long partSize;
    if (bytesRemaining > size_of_part)
    {
        partSize = size_of_part;
    }
    else
    {
        partSize = bytesRemaining;
    }
可以缩短为:

partSize = std::min(bytesRemaining, size_of_part);
这清楚地表明了你的意图


另一个问题是,在编写输出的循环中,
字节剩余
永远不会得到更新

byteslaining-=零件尺寸;

首先,你的代码有很多问题,都是因为使用C风格编码而不是使用C++。相反,如果你使用了<代码> STD::String 和C++流,很多问题将自行解决。 第一个问题是,您从未检查该文件是否存在:

FILE *fp_read = fopen(file_name, "rb");
如果
fp\u read
为空,则您从未检查它,并且您的代码继续运行,就好像没有任何错误。这是不正确的

然后在代码中执行以下操作:

  FILE *fp_write = fopen(name, "wb");
同样,如果
fp\u write
可以为空,则不检查它是否正常


但是我们假设
fp_read
fp_write
不为空

//extract file name
char *first_part = new char[255];
char *temp = new char[255];
strcpy(temp, file_name);
以上有两个潜在问题

第一个问题是,您没有进行检查以确保
文件名
少于255个字符。如果
文件名
大于预期值,则在调用
strcpy
时会发生内存覆盖。请使用
strncpy
memcpy
声明要复制的字符数

第二个问题更微妙,那就是您调用了两次
new[]
。如果对
new[]
的第二次调用引发了异常,该怎么办?您将如何取消对
new[]
的第一次调用?您不能。此外,由于引发了异常,您的输入文件仍将被打开

这就是为什么在这些情况下应该使用流的
std::string
ifstream
的原因。如果函数出于任何原因返回,这些类型会自动释放分配的任何资源。使用
C
样式字符串和I/O会使您容易泄漏

同样的问题:

//main process
char* name = new char[255];
strcpy(name, output_folder);
int bytesRemaining = file_size;

//create buffer
char *buffer = new char[size_of_part];
所有这些对
new[]
的调用都可能引发
抛出
,从而留下此函数,并导致内存泄漏和打开文件句柄


另一个问题是,您需要确保您的
缓冲区不会溢出。此代码:

    long partSize;
    if (bytesRemaining > size_of_part)
    {
        partSize = size_of_part;
    }
    else
    {
        partSize = bytesRemaining;
    }
可以缩短为:

partSize = std::min(bytesRemaining, size_of_part);
这清楚地表明了你的意图


另一个问题是,在编写输出的循环中,
字节剩余
永远不会得到更新

byteslaining-=零件尺寸;

循环内.

首先,代码中有很多问题,都是因为使用C风格编码而不是使用C++。