分段故障(Core Dumped)向Linux发出窗口

时间:2014-01-13 04:04:46

标签: c++ core dump fault

我一直在Windows上使用Visual Studio进行编程,我的代码工作正常,但是当在Ubuntu上运行时,我遇到了“分段错误(核心转储)”问题,我不知道是什么导致它。我不知道代码中的问题在哪里,所以我粘贴了所有内容。提前谢谢!

#include "Person.h"
#include "Grade.h"

using std::ifstream;
using std::ofstream;
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::stringstream;
using std::fixed;
using std::setprecision;
using std::setfill;

unsigned z = 0;
unsigned y = 0;

void firstInput(vector<Person>& peoples, char *argv[])
{
int x = 0;
string idy, namey, addressy, phoney, s;

ifstream one;
one.open(argv[1]);

while (getline(one, s))
{
    if (x == 0)
    {
        idy = s;
    }

    if (x == 1)
    {
        namey = s;
    }

    if (x == 2)
    {
        addressy = s;
    }

    if (x == 3)
    {
        phoney = s;
        Person *f1 = new Person(idy, namey, addressy, phoney);
        peoples.push_back(*f1);
        x = -1;
    }

    x++;

}

one.close();
}

void secondInput(vector<Grade>& gradies, char *argv[])
{
int b;
string z, idy2, gradey, classy;

ifstream two;
two.open(argv[2]);

b = 0;

while (getline(two, z))
{
    if (b == 0)
    {
        classy = z;
    }

    if (b == 1)
    {
        idy2 = z;
    }

    if (b == 2)
    {
        gradey = z;
        Grade *g1 = new Grade(classy, idy2, gradey);
        gradies.push_back(*g1);
        b = -1;
    }
    b++;
}

two.close();
}

double scoreConverter(string lettergrade)
{
double converted = 0.0;

if (lettergrade.substr(0,1) == "A")
{
    converted += 4;
}

if (lettergrade.substr(0,1) == "B")
{
    converted  += 3;
}

if (lettergrade.substr(0,1) == "C")
{
    converted += 2;
}

if (lettergrade.substr(0,1) == "D")
{
    converted += 1;;
}

if (lettergrade.size() > 1)
{
    if (lettergrade.substr(1,2) == "-")
    {
        converted -= 0.3;
    }
    if (lettergrade.substr(1,2) == "+")
    {
        converted += 0.4;
    }
}
return converted;
}

void computeGPA(vector<Grade>& s, vector<Person>& p, string IDnum)
{
int count = 0;
y = 0;
double gpa = 0;

    for (string x = IDnum; y < s.size(); y++)
    {
        if (x == s.at(y).getIDs())
        {
        gpa += scoreConverter(s.at(y).getScore());
        count++;
        }
    }   
        if (gpa > 0)
        {
        gpa = gpa / count;
        }
        cout << IDnum << "    ";
        cout << fixed << setprecision(2) << setfill('0') << gpa << "    ";

    for (unsigned x = 0; x < p.size(); x++)
    {
        if (IDnum == p.at(x).getID())
        {
            cout << p.at(x).getName() << endl;
            x = 1000;
        }
    }

    z = y;
}

void thirdInput(vector<Grade>& gradies, vector<Person>& persons, char *argv[])
{
string querying;

ifstream three;
three.open(argv[3]);


while(getline(three, querying))
{
for (unsigned x = 0; x < persons.size(); x++)
{
    if (querying == persons.at(x).getID())
    {
        computeGPA(gradies, persons, persons.at(x).getID());
        x = 1000;
    }
}
}
}

int main(int argc, char *argv[]) {

ofstream outputit;
outputit.open(argv[4]);

std::ofstream out(argv[4]);
std::cout.rdbuf(out.rdbuf());

vector<Person> people;
vector<Grade> grades;

firstInput(people, argv);

std::sort(people.begin(), people.end());

    for (unsigned x = 0; x < people.size(); x++)
    {
        cout << people.at(x).getName() << endl;
        cout << people.at(x).getID() << endl;
        cout << people.at(x).getPhone() << endl;
        cout << people.at(x).getAddress() << endl;
    }

    cout << endl;

secondInput(grades, argv);

std::sort(grades.begin(), grades.end());

for (unsigned x = 0; x < grades.size(); x++)
{
    cout << grades.at(x).getIDs() << "    ";
    cout << grades.at(x).getScore() << "    ";
    cout << grades.at(x).getClass() << endl;
}

cout << endl;

thirdInput(grades, people, argv);

outputit.close();
}

1 个答案:

答案 0 :(得分:1)

为了找出发生分段错误的位置,您可以使用gdb

假设您正在使用GCC,请使用-ggdb编译您的程序。

使用以下命令运行程序:

gdb myprog myinputs.txt

gdb提示符后,输入run。一旦进程分段出现故障,您应该返回gdb提示符。从那里,您可以输入bt来获取回溯。

这应该为您提供足够的信息来调查您的错误。