Untitled

 avatar
unknown
plain_text
2 years ago
5.3 kB
4
Indexable
#define _CRT_SECURE_NO_WARNINGS


#include <iostream>
#include <string>
#include <vector>
#include <deque>

#include <fstream>

#include <bitset>

using namespace std;



void MergeSortedIntervals(vector<int>& v, int s, int m, int e);
void MergeSort(vector<int>& v, int s, int e);
int merge_files(deque<string>& file_temp_names, int temp_file);

class TapeController
{
public:
	int move_left(fstream& file)
	{		
		long pos_g = file.tellg();
		long pos_p = file.tellp();
		file.seekp(pos_p - 4);
		file.seekg(pos_g - 4);

		return 0;
	}

	int move_right(fstream& file)
	{
		long pos_g = file.tellg();
		long pos_p = file.tellp();
		file.seekp(pos_p + 4);
		file.seekg(pos_g + 4);

		return 0;
	}

	int get_data(fstream& file)
	{		
		int number;		

		file.read((char*)&number, sizeof(number));

		long pos_g = file.tellg();
		file.seekg(pos_g - 4);


		return number;
	}


	int set_data(fstream& file, int number)
	{

		file.write((char*)&number, sizeof(number));

		long pos_p = file.tellp();
		file.seekp(pos_p - 4);

		return 0;
	}
};



int main()
{
//create file--------------------------------------------------

	vector<int> gen_data{ 112837,2,3,5,7,1,2,19,17,26,15,9,4,4,5,182,19,82,1137,2,33,5,72,1,42,19,17,26,113425,9,4,14,5,182,19,82 };

	TapeController cntrl;
	fstream file("Tape_in.txt", ios::out | ios::binary);
	for (int i = 0; i < gen_data.size(); i++)
	{	
		cntrl.set_data(file, gen_data[i]);
		cntrl.move_right(file);
	}
	
	file.close();
//create_file end----------------------------------------------------------

//div file-----------------------------------------------------------------
	int M = 10;

	deque<string> file_temp_names;

	fstream fin("Tape_in.txt", ios::in | ios::out | ios::binary);



    int number;
	int temp_file = 0;
    if (fin && !fin.eof())
    {
		while (fin)
		{
			vector<int> v_in_M_elems;
			
			int i;
			for ( i = 0; fin && !fin.eof() && i < M; i++)
			{
				v_in_M_elems.push_back(cntrl.get_data(fin));
				cntrl.move_right(fin);
			}
			
			if (i < M)
			{
				i--;
				v_in_M_elems.pop_back();
			}

			MergeSort(v_in_M_elems, 0, i - 1);

			fstream fout("temp\\Tape_temp"+to_string(temp_file)+".txt", ios::out | ios::binary);
			file_temp_names.push_back("temp\\Tape_temp" + to_string(temp_file) + ".txt");
			for (int i = 0; i < v_in_M_elems.size(); i++)
			{
				cntrl.set_data(fout, v_in_M_elems[i]);
				cntrl.move_right(fout);
			}

			fout.close();

			temp_file++;
		}

			
		fin.close();
    }

//div file end-----------------------------------------------------------------

//merge files------------------------------------------------------------------
	while (file_temp_names.size() != 0)
	{
		temp_file = merge_files(file_temp_names, temp_file);
	}
//merge files end--------------------------------------------------------------
    return 0;
}

int merge_files(deque<string>& file_temp_names, int temp_file)
{

	TapeController cntrl;

	string f0, f1,fout_name;
	f0 = file_temp_names.front();
	file_temp_names.pop_front();

	f1 = file_temp_names.front();
	file_temp_names.pop_front();

	fstream fin0(f0, ios::in | ios::out | ios::binary);
	fstream fin1(f1, ios::in | ios::out | ios::binary);


	if (file_temp_names.size() == 0)
	{
		fout_name = "Tape_out.txt";
	}
	else
	{
		temp_file++;
		file_temp_names.push_back("temp\\Tape_temp" + to_string(temp_file) + ".txt");
		fout_name = "temp\\Tape_temp" + to_string(temp_file) + ".txt";
	}
		

	fstream fout(fout_name, ios::out | ios::binary);
	
	int num0, num1;
	if (fin0 && !fin0.eof())
	{
		if (fin1 && !fin1.eof())
		{
			num0 = cntrl.get_data(fin0);
			num1 = cntrl.get_data(fin1);

			while (fin0 && fin1)
			{
				if (num0 <= num1)
				{
					cntrl.set_data(fout, num0);
					cntrl.move_right(fout);

					cntrl.move_right(fin0);
					num0 = cntrl.get_data(fin0);
					
				}
				else
				{
					cntrl.set_data(fout, num1);
					cntrl.move_right(fout);

					cntrl.move_right(fin1);
					num1 = cntrl.get_data(fin1);
					
				}

				if (!fin0 && fin1)
				{
					while (fin1)
					{
						cntrl.set_data(fout, num1);
						cntrl.move_right(fout);

						cntrl.move_right(fin1);
						num1 = cntrl.get_data(fin1);
						
					}
				}

				if (fin0 && !fin1)
				{
					while (fin0)
					{
						cntrl.set_data(fout, num0);
						cntrl.move_right(fout);

						cntrl.move_right(fin0);
						num0 = cntrl.get_data(fin0);
						
					}
				}

			}
			fout.close();
		}
	}


	fin0.close();
	fin1.close();


	

	return temp_file;
}

void MergeSortedIntervals(vector<int>& v, int s, int m, int e) 
{
	vector<int> temp;

	int i, j;
	i = s;
	j = m + 1;

	while (i <= m && j <= e) {

		if (v[i] <= v[j]) {
			temp.push_back(v[i]);
			++i;
		}
		else {
			temp.push_back(v[j]);
			++j;
		}

	}

	while (i <= m) {
		temp.push_back(v[i]);
		++i;
	}

	while (j <= e) {
		temp.push_back(v[j]);
		++j;
	}

	for (int i = s; i <= e; ++i)
		v[i] = temp[i - s];

}


void MergeSort(vector<int>& v, int s, int e) 
{
	if (s < e) {
		int m = (s + e) / 2;
		MergeSort(v, s, m);
		MergeSort(v, m + 1, e);
		MergeSortedIntervals(v, s, m, e);
	}
}
Editor is loading...