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