⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileworks.cs

📁 按照Clifford A . Shaffer《数据结构与算法分析(第二版)》指导
💻 CS
📖 第 1 页 / 共 3 页
字号:
            removelist.Add(thisOffset);

            //insertBuffer.Remove(removelist);
            //下面应该写错了, .Contains()是判断同个对象,而不是相等对象
            //if (insertBuffer.Contains(removelist))//如果只是在buffer,还未写入硬盘
            //{
            //    insertBuffer.Remove(removelist);
            //}

            i = 0;
            int j = 0;
            int flag = 0;
            //因为不知道怎么重写ArrayList.Equals();不得已的办法
            foreach (ArrayList testlist in insertBuffer)
            {
                i = 0;
                foreach (Object elem in testlist)
                {
                    if (!elem.Equals(removelist[i]))//不相等就跳出
                    {
                        //flag = 1;
                        break;
                    }
                    i++;
                }
                if (i == testlist.Count)//相等就跳出
                {
                    flag = 1;
                    break;
                }
                j++;
            }
            if (flag == 1)
            {
                insertBuffer.RemoveAt(j);
            }

            removeBuffer.Add(removelist);
            EmptyRecs.Add(thisOffset);
            return true;
        }

        //complete
        //file_Of_trees has Strings as its element
        public bool saveToFile(ArrayList trees, ArrayList file_Of_trees)
        {
            //晕,居然忘记考虑只有remove的情况了,于是写了下面的废代码
            //if (insertBuffer.Count == 0)
            //{
            //    return false;
            //}
            FileInfo ofd;
            StreamWriter Swriter;
            //Stream ofileforMain;
            FileStream writer;

            #region//trees region complete
            int i = 0;
            foreach (Object tree in trees)
            {
                ofd = new FileInfo((String)file_Of_trees[i]);
                //StreamWriter otreefile = new StreamWriter(@"F:\testDS\test.bin");
                Swriter = ofd.CreateText();
                if(tree is Treeworks.BPTree<int, int, intintCompare>)
                {
                    saveTreeToFile((Treeworks.BPTree<int, int, intintCompare>)tree, Swriter);
                }
                else if (tree is Treeworks.BPTree<string, int, strstrCompare>)
                {
                    saveTreeToFile((Treeworks.BPTree<string, int, strstrCompare>)tree, Swriter);
                }
                i++;
            }
            #endregion

            #region//EmptyRecs region complete
            ofd = new FileInfo(nameofEmptyRecs);//急需修改,如何改成读写本文件夹下的文件路径?
            if (ofd.Exists && ((ofd.Attributes & FileAttributes.ReadOnly) == 0))
            {
                Swriter = ofd.CreateText();

                foreach (int emptyrec in EmptyRecs)
                {
                    Swriter.Write("{0} ", emptyrec.ToString().PadRight(20, ' '));//count the length of int 20
                }
                Swriter.Close();
            }
            #endregion

            #region//MainRecs region
            ofd = new FileInfo(nameofMainRecs);//急需修改,如何改成读写本文件夹下的文件路径?
            if (ofd.Exists && ((ofd.Attributes & FileAttributes.ReadOnly) == 0))
            {
                StringBuilder str = new StringBuilder();
                //ofileforMain = ofd.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
                writer = ofd.Open(FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read);
                //writer = File.Open(

                foreach (ArrayList insertlist in insertBuffer)
                {
                    //将insertlist中最后的那个offset赋值给别人后删除这个元素
                    int thisOffset = (int)insertlist[insertlist.Count - 1];
                    insertlist.RemoveAt(insertlist.Count - 1);

                    i = 0;
                    str.Remove(0, str.Length);
                    foreach (Object rec in insertlist)
                    {
                        str.Append(rec.ToString().PadRight((int)(sizeofRec[i]), ' ') + " ");
                        i++;
                    }

                    byte[] thisline = Encoding.Default.GetBytes(str.ToString());
                    //ofileforMain.Seek((long)thisOffset * sizeofRec * numofColumn, SeekOrigin.Begin);
                    writer.Seek((long)thisOffset * sizeofLine, SeekOrigin.Begin);
                    writer.Write(thisline, 0, thisline.Length);
                }

                //ofileforMain.Close();
                writer.Close();
            }
            #endregion

            #region//test Index.bin region
            ofd = new FileInfo(nameofIndex);
            //暂时就是这些,如果用户管理肯定要增加
            Swriter = ofd.CreateText();
            Swriter.WriteLine(nameofMainRecs);
            Swriter.WriteLine(nameofEmptyRecs);
            Swriter.WriteLine(MaxOffset);
            StringBuilder strBlder = new StringBuilder();
            foreach (object obj in sizeofRec)
            {
                strBlder.Append(obj.ToString() + ' ');
            }
            Swriter.WriteLine(strBlder);
            int count = 0;
            foreach (object obj in file_Of_trees)
            {
                if (this.Trees[count] is Treeworks.BPTree<int, int, intintCompare>)
                {
                    Swriter.WriteLine("int int " + obj.ToString());
                }
                else if (this.Trees[count] is Treeworks.BPTree<string, int, strstrCompare>)
                {
                    Swriter.WriteLine("string int " + obj.ToString());
                }
                else
                { //nothing to do
                }
                count++;
            }
            //Swriter.WriteLine();
            Swriter.Close();
            #endregion

            //好险忘了这个
            insertBuffer.Clear();
            removeBuffer.Clear();

            return true;
        }

        //complete
        //have to close otreefile
        private bool saveTreeToFile(Treeworks.BPTree<int, int, intintCompare> tree, StreamWriter otreefile)
        {
            ArrayList treeBuffer = new ArrayList();

            Treeworks.BPNode<int> temptr = tree.leftMostleaf;

            while (temptr != null)
            {
                for (int i = 0; i < temptr.numrec; i++)
                {
                    Object templptr = temptr.recs[i].ptr;
                    ArrayList line = new ArrayList();

                    line.Add(temptr.recs[i].key);

                    if (templptr is Treeworks.Link<int>)//有下挂链表
                    {
                        while (templptr != null)
                        {
                            line.Add(((Treeworks.Link<int>)templptr).ptr);
                            templptr = ((Treeworks.Link<int>)templptr).lptr;//下移
                        }
                    }
                    else//无下挂链表
                    {
                        line.Add(templptr);
                    }
                    treeBuffer.Add(line);
                }

                temptr = temptr.rightptr;
            }

            foreach (ArrayList a in treeBuffer)
            {
                foreach (Object p in a)
                {
                    otreefile.Write("{0} ", p);
                }
                otreefile.WriteLine();
                //otreefile.WriteLine("{0}", a.ToArray());//这个只能打印出数组第一个元素,真不知道WriteLine的这个重载有什么用
            }

            otreefile.Close();
            return true;
        }

        //c#2.0对泛型的支持似乎仍然只是停留在表面,
        //不支持模板类作为函数参数传递使得它的应用受到很大限制
        //比如说居然要这个函数重载同一模板类的不同类型......失败啊
        private bool saveTreeToFile(Treeworks.BPTree<string, int, strstrCompare> tree, StreamWriter otreefile)
        {
            ArrayList treeBuffer = new ArrayList();

            Treeworks.BPNode<string> temptr = tree.leftMostleaf;

            while (temptr != null)
            {
                for (int i = 0; i < temptr.numrec; i++)
                {
                    Object templptr = temptr.recs[i].ptr;
                    ArrayList line = new ArrayList();

                    line.Add(temptr.recs[i].key);

                    if (templptr is Treeworks.Link<string>)//有下挂链表
                    {
                        while (templptr != null)
                        {
                            line.Add(((Treeworks.Link<string>)templptr).ptr);
                            templptr = ((Treeworks.Link<string>)templptr).lptr;//下移
                        }
                    }
                    else//无下挂链表
                    {
                        line.Add(templptr);
                    }
                    treeBuffer.Add(line);
                }

                temptr = temptr.rightptr;
            }

            foreach (ArrayList a in treeBuffer)
            {
                foreach (Object p in a)
                {
                    otreefile.Write("{0} ", p);
                }
                otreefile.WriteLine();
                //otreefile.WriteLine("{0}", a.ToArray());//这个只能打印出数组第一个元素,真不知道WriteLine的这个重载有什么用
            }

            otreefile.Close();
            return true;
        }

        //complete /////but maybe some bugs in 
        public bool giveUpChanges(ArrayList trees)
        {
            //写了大段很废的代码,最后决定还是读文件!
            //ArrayList tempBuffer = new ArrayList(insertBuffer.Count);
            //tempBuffer = ArrayList.Synchronized(insertBuffer);//copy insertBuffer to tempBuffer
            //foreach (ArrayList templist in insertBuffer)
            //{
            //    tempBuffer.Add(templist);
            //}

            //insertBuffer.Clear();
            //foreach(ArrayList removedRec in removeBuffer)
            //{
            //    removedRec.RemoveAt(removedRec.Count - 1);
            //    insert(removedRec,  trees);
            //}
            //removeBuffer.Clear();
            //foreach (ArrayList insertedRec in tempBuffer)
            //{
            //    Object thisOffset = insertedRec[insertedRec.Count - 1];
            //    insertedRec.RemoveAt(insertedRec.Count - 1);
            //    remove(insertedRec, ref thisOffset, trees);
            //}
            readAllFromFile();
            insertBuffer.Clear();
            removeBuffer.Clear();
            return true;
        }
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -