Cần giải thích lỗi code thao tác với FILE

dạ em có bài tập làm file splitter joiner, em viết hàm split và test thử với 1 file MP4 thì n-1 part đầu ok, còn part cuối lúc nào cũng ko xem được, anh chị nào có kinh nghiệm có thể giải thích cho em được ko ạ :smiley: đây là hàm split của em

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] = "";
	//split first n-1 part
	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);
}

cái ghi chú split n-1 part là do nãy em mới test việc ghi riêng part cuối ạ :v nói chung là coi như ko có dòng ghi chú đó nha anh/chị, kẻo hiểu lầm hehe

mod @ltd có thể close topic dùm em được ko ạ :smiley:

xong rồi hả :wink:

1 Like

vai close topic trong khi chua co comment

bạn chia sẽ cách giải quyết luôn, các bạn sau này vào không phải vướng mắc nữa

OK, sau 1 hồi tìm hiểu thì mình nhận ra là cái file MP4 là một kiểu dữ liệu có cấu trúc nên nó sẽ có phần header chứa các thông tin cần thiết để play được. Khi mà tách file ra thì chỉ có part 1 có cái header đó nên các part sau không xem được :smiley: code cho bạn nào cần (nếu gặp phải bài này)

    const 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");
    	if (fp_read != NULL)
    	{
    		//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
		const char *first_part = "";
		char *temp = new char[255];
		strcpy(temp, file_name);
		first_part = GetFileName(temp);
		cout << endl << "File name is: " << first_part << endl;


		//main process
		char name[300]="";
		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); 
			char temp[300] = "";
			strcpy(temp, output_folder);
			strcat(temp, name);

			FILE *fp_write = fopen(temp, "wb");
			if (fp_write != NULL)
			{
				long partSize;
				if (bytesRemaining > size_of_part)
				{
					partSize = size_of_part;
				}
				else
				{
					partSize = bytesRemaining;
				}
				bytesRemaining -= partSize;

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

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

			}
		}
		_fcloseall();
		delete[] buffer;
		delete[] temp;
	}
}
1 Like

ông nội Phi đó hả :v

thật ra cái mình hỏi cũng ko liên quan lắm :v chỉ là hiểu lầm cái kết quả

Tưởng bạn join tất cả lại rồi mới xem hình chứ :smile:

lúc đầu mình tưởng là split nó ra vẫn xem được từng phần =))

uk. tui đây. mới đăng lên sao đòi xóa liền vậy cu?

làm được rồi chứ sao…

mà sao t nối lại đc rồi mà sao không nghe tiếng nhỉ?

ok rồi
ĐÃ xong deadlline

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?