gpt4 book ai didi

c++ - C++中的文件拆分器

转载 作者:行者123 更新时间:2023-11-28 06:18:49 26 4
gpt4 key购买 nike

我正在尝试用 C++ 制作文件拆分器/连接器,但我的拆分函数遇到了问题。我用一个 MP4 文件进行了快速测试,结果是:其他部分都可以,但最后一部分总是不起作用。我不明白这一点。谁能给我解释一下?这是我的拆分函数:

void split_F(const char* file_name, 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
//int number_of_part = (int)ceil((double)file_size / size_of_part);
long size_of_part;
size_of_part = (int)floor((double)file_size / number_of_part);
cout << "Total files after split: " << number_of_part << endl
<< "...Processing..." << endl;

//main process
char name[255] = "";
for (int count = 1; count <= number_of_part; count++)
{
sprintf(name, "%s.part_%03d", file_name, count);
FILE *fp_write = fopen(name, "wb");

//create buffer
char *buffer = new char[size_of_part];
memset(buffer, NULL, size_of_part); //reset buffer

fread(buffer, size_of_part, 1, fp_read);
fwrite(buffer, size_of_part, 1, fp_write);
fseek(fp_read, count*size_of_part, SEEK_SET);

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

delete[] buffer;
fclose(fp_write);
}
fclose(fp_read);
}

最佳答案

最后一部分可能会小于或大于 size_of_part,因为原始文件大小不是它的倍数。

您需要自动调整最后一部分的大小。

例如,如果您的文件大小为 1000 字节,分为 7 个部分。您计算出的文件大小将为 142。7*142 = 994,您缺少最后 6 个字节。这是你的问题吗?

fseek 不是必需的,为什么要使用它?你只需要顺序读取输入文件

void split_F(const char* file_name, 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;

//main process
char name[255] = "";
int bytesRemaining = file_size;

//create buffer, we reuse it for each part
char *buffer = new char[size_of_part];

//No need to reset buffer
//memset(buffer, NULL, partSize);


for (int count = 1; count <= number_of_part; count++)
{
sprintf(name, "%s.part_%03d", file_name, count);
FILE *fp_write = fopen(name, "wb");

int 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;
}

关于c++ - C++中的文件拆分器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29698626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com