Exemple #1
0
        public void Generate(int amount, int max)
        {
            int record;

            df.OpenSaveStream("MainFile.txt");
            for (int i = 0; i < amount; i++)
            {
                record = random.Next(1, max);
                df.SaveRecord(record, "MainFile.txt");
            }
            df.FlushRecordBuffer("MainFile.txt");
            df.CloseStream("MainFile.txt");
            df.ZeroWriteOp();
        }
        public static void FibonacciMerge(DiskFunctionality df, RunInfo ri, string tape1, string tape2, string tape3, bool show, bool showDiv)
        {
            int    phases = 0;
            int    input1Runs = ri.GetRuns(tape1), input2Runs = ri.GetRuns(tape2);
            string input1 = tape1, input2 = tape2, output = tape3;

            Console.WriteLine("Phase " + phases + " finished. Tape content:");
            if (show)
            {
                df.OpenReadStream(input1);
                df.OpenReadStream(input2);
                Console.WriteLine("\n" + input1 + " content:");
                df.ShowFileContent(input1, showDiv);
                Console.WriteLine("\n" + input2 + " content:");
                df.ShowFileContent(input2, showDiv);
                df.CloseStream(input1);
                df.CloseStream(input2);
            }
            df.OpenReadStream(input1);
            df.OpenReadStream(input2);
            df.OpenSaveStream(output);
            while (true)
            {
                if (input1Runs > input2Runs)
                {
                    for (int i = 0; i < input2Runs; i++)
                    {
                        MergeRuns(df, input1, input2, output);
                    }
                    input1Runs -= input2Runs;
                    df.FlushRecordBuffer(output);
                    df.CloseStream(output);
                    df.CloseStream(input2);
                    phases++;
                    Console.WriteLine("Phase " + phases + " finished. Tape content:");
                    if (show)
                    {
                        df.OpenReadStream(output);
                        Console.WriteLine("\n" + input1 + " content:");
                        df.ShowFileContent(input1, showDiv);
                        Console.WriteLine("\n" + output + " content:");
                        df.ShowFileContent(output, showDiv);
                        df.CloseStream(output);
                    }



                    swap(ref input2, ref output);
                    df.OpenSaveStream(output);
                    df.OpenReadStream(input2);
                }
                else if (input1Runs < input2Runs)
                {
                    for (int i = 0; i < input1Runs; i++)
                    {
                        MergeRuns(df, input1, input2, output);
                    }
                    input2Runs -= input1Runs;
                    df.FlushRecordBuffer(output);
                    df.CloseStream(output);
                    df.CloseStream(input1);
                    phases++;

                    Console.WriteLine("Phase " + phases + " finished. Tape content:");
                    if (show)
                    {
                        df.OpenReadStream(output);
                        Console.WriteLine("\n" + input2 + " content:");
                        df.ShowFileContent(input2, showDiv);
                        Console.WriteLine("\n" + output + " content:");
                        df.ShowFileContent(output, showDiv);
                        df.CloseStream(output);
                    }



                    swap(ref input1, ref output);
                    df.OpenSaveStream(output);
                    df.OpenReadStream(input1);
                }
                else if (input1Runs == 1 && input2Runs == 1)
                {
                    MergeRuns(df, input1, input2, output);
                    df.CloseStream(input1);
                    df.CloseStream(input2);
                    df.FlushRecordBuffer(output);
                    df.CloseStream(output);
                    phases++;
                    Console.WriteLine("\n" + "File after sorting:");
                    df.OpenReadStream(output);
                    df.ShowFileContent(output, true);
                    df.CloseStream(output);
                    Console.WriteLine("Number of phases: " + phases);
                    return;
                }
            }
        }
        public static RunInfo DivideBetweenTapes(DiskFunctionality df, string main, string tape1, string tape2)
        {
            int record = -1, previousRecord;
            int whichTape = 1, tape1Runs = 0, tape2Runs = 0, whichFibonacci = 0;
            int fibbNumber = GetFibonacciNumber(whichFibonacci);

            df.OpenReadStream(main);
            df.OpenSaveStream(tape1);
            df.OpenSaveStream(tape2);
            while (true)
            {
                previousRecord = record;
                record         = df.ReadRecord(main);
                if (record == -1)
                {
                    break;
                }
                if (whichTape == 1)
                {
                    if (Compare(previousRecord, record))
                    {
                        df.SaveRecord(record, tape1);
                    }
                    else
                    {
                        tape1Runs++;
                        if (tape1Runs == fibbNumber)
                        {
                            df.SaveRecord(record, tape2);
                            whichTape = 2;
                            whichFibonacci++;
                            fibbNumber = GetFibonacciNumber(whichFibonacci);
                        }
                        else
                        {
                            df.SaveRecord(record, tape1);
                        }
                    }
                }
                else
                {
                    if (Compare(previousRecord, record))
                    {
                        df.SaveRecord(record, tape2);
                    }
                    else
                    {
                        tape2Runs++;
                        if (tape2Runs == fibbNumber)
                        {
                            df.SaveRecord(record, tape1);
                            whichTape = 1;
                            whichFibonacci++;
                            fibbNumber = GetFibonacciNumber(whichFibonacci);
                        }
                        else
                        {
                            df.SaveRecord(record, tape2);
                        }
                    }
                }
            }
            if (whichTape == 1)// dummy runs
            {
                tape1Runs = GetFibonacciNumber(whichFibonacci);
            }
            else
            {
                tape2Runs = GetFibonacciNumber(whichFibonacci);
            }
            df.FlushRecordBuffer(tape1);
            df.FlushRecordBuffer(tape2);
            df.CloseStream(main);
            df.CloseStream(tape1);
            df.CloseStream(tape2);
            Console.WriteLine("Divide finished. Sorting...");
            return(new RunInfo(tape1Runs, tape2Runs));
        }