30/09/2018, 16:55

[Thao tác với FILE trong C] cần lắm 1 người giải thích

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 ạ đâ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);
}
Ha Gia Phat viết 19:07 ngày 30/09/2018

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

Ha Gia Phat viết 19:10 ngày 30/09/2018

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

Lê Đình Huy viết 19:00 ngày 30/09/2018

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

xong rồi hả …

Minh Hoàng viết 19:10 ngày 30/09/2018

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

Ha Gia Phat viết 19:10 ngày 30/09/2018

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

}

Ha Gia Phat viết 19:05 ngày 30/09/2018

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

Ha Gia Phat viết 19:03 ngày 30/09/2018

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ả

Minh Hoàng viết 19:08 ngày 30/09/2018

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

Ha Gia Phat viết 18:56 ngày 30/09/2018

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

Ha Gia Phat viết 19:06 ngày 30/09/2018

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

Bài liên quan
0