鱼C论坛

 找回密码
 立即注册
查看: 1074|回复: 1

Assertion failed:in>>data 报错abort() has been called

[复制链接]
发表于 2021-12-26 14:32:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 小易zjy 于 2021-12-26 14:41 编辑

在进行数据结构课程设计时,所需排序的数据(ele类:其中Word存放单词信息,Num存放单词个数)包含多个信息(单词、单词个数),为了将待排序的数据按照单词个数进行排序,设计了存放待排序元素的数据表类datalist.
但是在进行文件读写时出现了Assertion failed:in>>data  报错abort() has been called的错误,查阅CSDN上相关资料,可能是调用了野指针或是内存泄露,看得云里雾里也不知道该怎么解决呜呜呜
报错信息在datalist.h line 79 小菜鸟一枚,麻烦各位大佬了(或者有没有更合适的数据结构可以实现包含多个数据类型的结构体按照某一关键字的排序呢)
datalist.h
  1. #pragma once
  2. #ifndef DATALIST_H
  3. #define DATALIST_H
  4. #include <iostream>
  5. #include <cassert>
  6. #include"ele.h"
  7. using namespace std;

  8. const int DefaultSize = 50;

  9. template <typename E, typename K>class dataList {
  10. public:
  11.         dataList(int sz = DefaultSize) {
  12.                 maxSize = sz;
  13.                 currentSize = 0;
  14.                 Element = new E[sz];
  15.                 assert(Element);
  16.         }
  17.         dataList(dataList<E, K>& R) {
  18.                 maxSize = R.maxSize;
  19.                 currentSize = R.currentSize;
  20.                 Element = new E[maxSize];
  21.                 assert(Element);
  22.                 for (int i = 0; i < currentSize; i++) {
  23.                         Element[i] = R.Element[i];
  24.                 }
  25.         }
  26.         virtual ~dataList() {
  27.                 delete[]Element;
  28.         }
  29.         virtual int Length() {
  30.                 return currentSize;
  31.         }
  32.         virtual bool SeqSearch(const K k1)const;
  33.         virtual void keySearch(const K k1)const;
  34.         virtual int keyCount(const K k1)const;
  35.         void newDatalist(const K k1, dataList<E, K>& R);
  36.         virtual void repeatSearch(const K k1)const;
  37.         virtual bool Insert(E& e1);
  38.         virtual bool Remove(K k1, E& e1);
  39.         char least();
  40.         void Swap(E& x, E& y) {
  41.                 E temp = x;
  42.                 x = y;
  43.                 y = temp;
  44.         }
  45.         void Swap(int x, int y) {//#重载
  46.                 E temp = Element[x];
  47.                 Element[x] = Element[y];
  48.                 Element[y] = temp;
  49.         }
  50.         E& display(int x)
  51.         {
  52.                 return Element[x];
  53.         }
  54.         dataList<E, K>& operator = (dataList<E, K>& R) {
  55.                 maxSize = R.maxSize;
  56.                 currentSize = R.currentSize;
  57.                 Element = new E[maxSize];
  58.                 assert(Element);
  59.                 for (int i = 0; i < currentSize; i++) {
  60.                         Element[i] = R.Element[i];
  61.                 }
  62.                 return *this;
  63.         }
  64.         E& operator [] (int i) {
  65.                 return Element[i];
  66.         }
  67.         int Partition(const int low, const int high);
  68.         friend ostream& operator << (ostream& out, dataList<E, K>& R) {
  69.                 for (int i = 0; i < R.currentSize; i++) {
  70.                         out << R.Element[i] << endl;
  71.                 }
  72.                 return out;
  73.         }
  74.         friend istream& operator >> (istream& in, dataList<E, K>& R) {
  75.                 E data;
  76.                 while (!in.eof()) {
  77.                         assert(in >> data);
  78.                         R.Insert(data);
  79.                 }
  80.                 return in;
  81.         }
  82. protected:
  83.         E* Element;
  84.         int maxSize, currentSize;
  85. };

  86. template <typename E, typename K >bool dataList<E, K>::Insert(E& e1) {
  87.         if (currentSize == maxSize) {
  88.                 return false;
  89.         }
  90.         Element[currentSize] = e1;
  91.         currentSize++;
  92.         return true;
  93. }

  94. template <typename E, typename K>bool dataList<E, K>::Remove(K k1, E& e1) {
  95.         if (currentSize == 0) {
  96.                 return false;
  97.         }
  98.         int i;
  99.         for (i = 0; i < currentSize && Element[i] != k1; i++);
  100.         if (i == currentSize) {
  101.                 return false;
  102.         }
  103.         e1 = Element[i];
  104.         Element[i] = Element[currentSize - 1];
  105.         currentSize--;
  106.         return true;
  107. }

  108. template <typename E, typename K>bool dataList<E, K>::SeqSearch(const K k1)const {
  109.         int i;
  110.         for (i = 0; i < currentSize; i++) {
  111.                 if (Element[i] == k1)return true;
  112.         }
  113.         return false;
  114.         //return (i == currentSize) ? 0 : (i + 1);
  115. }

  116. template <typename E, typename K>void dataList<E, K>::keySearch(const K k1)const
  117. {
  118.         for (int i = 0; i < currentSize; i++)
  119.         {
  120.                 if (Element[i] == k1) { cout << Element[i] << "\t"; }
  121.         }
  122. }

  123. template <typename E, typename K>int dataList<E, K>::keyCount(const K k1)const
  124. {
  125.         int num = 0;
  126.         for (int i = 0; i < currentSize; i++)
  127.         {
  128.                 if (Element[i] == k1) { num++; }
  129.         }
  130.         return num;
  131. }

  132. template <typename E, typename K> void dataList<E, K>::newDatalist(const K k1, dataList<E, K>& R)
  133. {
  134.         for (int i = 0; i < currentSize; i++)
  135.         {
  136.                 if (Element[i] == k1)R.Insert(Element[i]);
  137.         }
  138. }

  139. template <typename E, typename K>void dataList<E, K>::repeatSearch(const K k1)const
  140. {
  141.         for (int i = 0; i < currentSize; i++)
  142.         {
  143.                 if (Element[i] == k1)cout << Element[i] << "\t"; /*return Element[i];*/
  144.         }
  145.         //return (i == currentSize) ? 0 : (i + 1);
  146. }

  147. template <typename E, typename K>char dataList<E, K>::least()
  148. {
  149.         char least = 'a';
  150.         int count = keyCount('a');
  151.         for (char x = 'b'; x <= 'z'; x++)
  152.         {
  153.                 if ((keyCount(x) < count) && keyCount(x) != 0) { count = keyCount(x); least = x; }
  154.         }
  155.         return least;
  156.         //leastSearch(Initial, least);
  157.         //return (i == currentSize) ? 0 : (i + 1);
  158. }

  159. template <typename E, typename K>int dataList<E, K>::Partition(const int low, const int high) {
  160.         //数据表类的共有函数
  161.         int pivotpos = low;
  162.         E pivot = Element[low];          //基准元素
  163.         for (int i = low + 1; i <= high; i++) {
  164.                 //检测整个序列, 进行划分
  165.                 if (Element[i] < pivot) {
  166.                         pivotpos++;
  167.                         if (pivotpos != i) {
  168.                                 Swap(Element[pivotpos], Element[i]);
  169.                         }
  170.                 }//小于基准的交换到左侧去
  171.         }
  172.         Element[low] = Element[pivotpos];
  173.         Element[pivotpos] = pivot;        //将基准元素就位       
  174.         return pivotpos;                        //返回基准元素位置
  175. }

  176. #endif
复制代码


ele.h
  1. #pragma once
  2. #include <string>
  3. #include <cassert>
  4. #include <iomanip>
  5. #include <iostream>
  6. using namespace std;

  7. class ele {
  8. public:
  9.         int key;
  10.         ele(int num = 0, string word = " ") {
  11.                 Num = num;
  12.                 Word = word;
  13.                 key = Num;
  14.         }
  15.         ele(ele& pr) {
  16.                 Num = pr.Num;
  17.                 Word = pr.Word;
  18.                 key = Num;
  19.         }
  20.         int getKey() {
  21.                 return key;
  22.         }
  23.         void setKey(int k1) {
  24.                 key = k1;
  25.         }
  26.         int getNum() {
  27.                 return Num;
  28.         }
  29.         void setNum(int num) {
  30.                 Num = num;
  31.         }
  32.         string getWord() {
  33.                 return Word;
  34.         }
  35.         void setWord(string word) {
  36.                 Word = word;
  37.         }
  38.         ele& operator = (const ele& pr) {
  39.                 Num = pr.Num;
  40.                 Word = pr.Word;
  41.                 key = Num;
  42.                 return *this;
  43.         }
  44.         ele& operator = (int k1) {
  45.                 Num = k1;
  46.                 key = Num;
  47.                 return *this;
  48.         }

  49.         friend bool operator < (const ele& pr, int k1) {
  50.                 return (pr.Num < k1);
  51.         }
  52.         friend bool operator <= (const ele& pr, int k1) {
  53.                 return (pr.Num <= k1);
  54.         }
  55.         friend bool operator > (const ele& pr, int k1) {
  56.                 return (pr.Num > k1);
  57.         }
  58.         friend bool operator >= (const ele& pr, int k1) {
  59.                 return (pr.Num >= k1);
  60.         }
  61.         friend bool operator == (const ele& pr, int k1) {
  62.                 return (pr.Num == k1);
  63.         }
  64.         friend bool operator != (const ele& pr, int k1) {
  65.                 return (pr.Num != k1);
  66.         }

  67.         friend bool operator < (int k1, const ele& pr) {
  68.                 return (k1 < pr.Num);
  69.         }
  70.         friend bool operator <= (int k1, const ele& pr) {
  71.                 return (k1 <= pr.Num);
  72.         }
  73.         friend bool operator > (int k1, const ele& pr) {
  74.                 return (k1 > pr.Num);
  75.         }
  76.         friend bool operator >= (int k1, const ele& pr) {
  77.                 return (k1 >= pr.Num);
  78.         }
  79.         friend bool operator == (int k1, const ele& pr) {
  80.                 return (k1 == pr.Num);
  81.         }
  82.         friend bool operator != (int k1, const ele& pr) {
  83.                 return (k1 != pr.Num);
  84.         }

  85.         friend bool operator < (const ele& pr1, const ele& pr2) {
  86.                 return (pr1.Num < pr2.Num);
  87.         }
  88.         friend bool operator <= (const ele& pr1, const ele& pr2) {
  89.                 return (pr1.Num < pr2.Num);
  90.         }
  91.         friend bool operator > (const ele& pr1, const ele& pr2) {
  92.                 return (pr1.Num > pr2.Num);
  93.         }
  94.         friend bool operator >= (const ele& pr1, const ele& pr2) {
  95.                 return (pr1.Num >= pr2.Num);
  96.         }
  97.         friend bool operator == (const ele& pr1, const ele& pr2) {
  98.                 return (pr1.Num == pr2.Num);
  99.         }
  100.         friend bool operator != (const ele& pr1, const ele& pr2) {
  101.                 return (pr1.Num != pr2.Num);
  102.         }
  103.         friend ostream& operator << (ostream& out, ele& pr) {
  104.                 out << pr.Word << '\t';
  105.                 return out;
  106.         }
  107.         friend istream& operator >> (istream& in, ele& pr) {
  108.                 in >> pr.Num >> pr.Word;
  109.                 pr.key = pr.Num;
  110.                 return in;
  111.         }
  112. private:
  113.         int Num;
  114.         string Word;
  115. };
复制代码


main.cpp
  1. #include <sstream>
  2. #include <fstream>
  3. #include <cassert>
  4. #include<iostream>
  5. #include<string.h>
  6. #include<algorithm>
  7. #include"datalist.h"
  8. #include"ele.h"
  9. using namespace std;
  10. int main
  11. {
  12. dataList<ele, int>list1;
  13.     remove("test.txt");
  14.     for (int j = 0; j < 10; j++)
  15.    {
  16.         ofstream ofs;
  17.         ofs.open("test.txt", ios::out | ios::app);
  18.         ofs << j << " " << "string" << endl;
  19.         ofs.close();
  20.     }
  21.     ifstream fin2;
  22.     fin2.open("test.txt");
  23.     assert(fin2 >> list1);
  24.     fin2.close();
  25.     cout << list1 << endl;
  26.     return 0;
  27. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-12-26 14:33:36 | 显示全部楼层
我觉得datalist.h和ele.h写的都没有问题,应该就是文件读写的时候出错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-22 04:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表