2 nnilnk nnilnk 于 2015.05.25 23:43 提问

c++初学者求助 Access violation reading location

函数如下

#include<iostream>
#include<fstream>
#include<iomanip>
using namespace std;
 int main()
{
    int Month, Day;
    string Name, Email, Address;
    while (cin >> Month >> Day >> Name >> Email >> Address)
    {
        Person p(Month ,Day,Name,Email,Address), m;
        int size = sizeof(Person);
        string name = p.getName();
        int month = p.getMonth(), day = p.getDay();
        fstream out1("SortByName.dat", ios::out | ios::in | ios::binary);//按姓名排序
        out1.seekp(0, ios::end);
        while (out1.tellp())
        {
            out1.seekp(-size, ios::cur);
            out1.read((char*)&m, size);
            if (m.getName() <= name)
                break;
            out1.seekp(out1.tellp(), ios::beg);
            out1.write((const char*)&m, size);
            out1.seekp(-2 * size, ios::cur);

        }
        out1.write((const char*)&p, size);
        out1.close();
        fstream out2("SortByBirthDay.dat", ios::out | ios::in | ios::binary);//按生日排序
        out2.seekp(0, ios::end);
        while (out2.tellp())
        {
            out2.seekp(-size, ios::cur);
            out2.read((char*)&m, size);
            if ((m.getMonth() < month) || (m.getMonth() == month&&m.getDay() <= day))
                break;
            out2.seekp(out2.tellp(), ios::beg);
            out2.write((const char*)&m, size);
            out2.seekp(-2 * size, ios::cur);
        }
        out2.write((const char*)&p, size);
        out2.close();
    }
}

头文件Person.h

//Person.h
 #ifndef PERSON_H
#define PERSON_H

#include<iostream>
#include<string>
using namespace std;

class Person
{
public:
    Person(int, int, string, string, string);
    Person(){};
    int getMonth() const;
    int getDay() const;
    string getName() const;
    void setEmail(string);
    void setTel(string);
    string getDayOfWeek() const;
    virtual void print() const;
protected:
    int month;
    int day;
    string m;
    string dayOfWeek;
    string name;
    string email;
    string tel;
};

#endif

Person.cpp在这

 #include"Person.h"

Person::Person(int a, int b, string c, string d, string e)
{
    month = a;
    day = b;
    name = c;
    email = d;
    tel = e;
    dayOfWeek = getDayOfWeek();
    string mm[12] = { "January", "February", " March", " April", " May", "June",
        "July", "August", "September", " October", " November", " December" };
    m = mm[month-1];
}
int Person::getMonth() const
{
    return month;
}

int Person::getDay() const
{
    return day;
}
string Person::getName() const
{
    return name;
}
void Person::setEmail(string a)
{
    email = a;
}
void Person::setTel(string a)
{
    email = a;
}
string Person::getDayOfWeek() const
{
    string week[7] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday" };
    int m=month,d=day,y=15;
    if (m < 3)
    {
        m += 12; y--;
    }
    int ans =  y + y / 4 + 26 * (m + 1) / 10 + d - 36;
    ans = (ans % 7 + 7) % 7;
    return week[ans];
}
void Person::print() const
{
    cout << m << '/' << day << '/' << dayOfWeek << "   " << name
        << "   Tel:" << tel << "   Email:" << email << endl;
}

调试时发现函数运行结束时错

Unhandled exception at 0x5527DF58 (msvcp120d.dll) in AddressBook.exe: 0xC0000005: Access violation reading location 0x0043E4A4.

求大神指导,在下感激不尽

4个回答

a1193561652
a1193561652   Rxr 2015.05.26 00:44

Person类你没贴出来呀。

nnilnk
nnilnk 已经贴出来了
2 年多之前 回复
91program
91program   Ds   Rxr 2015.05.26 07:32

建议你
1)提供完整的源代码,注意代码的格式。使用编辑模式上的 </> 工具。
2)使用 VS 工具调试一下,看看具体是哪一句引起的异常,这样就更容易分析问题的原因。

nnilnk
nnilnk 谢谢,我第一次来csdn发帖
2 年多之前 回复
mouyun1115
mouyun1115   2015.05.26 10:52

Person类源码没给出,顺便说一句,像你这样把类按字节读写文件是很危险的,如果类里有指针.........

mouyun1115
mouyun1115 回复nnilnk: 使用数据库
2 年多之前 回复
nnilnk
nnilnk 那应该怎么处理比较好呢
2 年多之前 回复
tianyang2008
tianyang2008   2015.05.26 13:37

推荐使用管理员运行。

nnilnk
nnilnk 试了,不行
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片