Project3.exe中0x00C61540处的未处理异常:0xC0000005:访问冲突读取位置0x00000003

时间:2014-06-18 03:25:02

标签: c++

每次运行此程序时,我都会收到错误消息。基本上它的作用是将一些信息写入文件,如果文件不存在则创建该文件。但是,当它第二次运行时,它需要读取以前创建的文件,由于某种原因抛出异常,我收到此错误:

Project3.exe中0x00C61540处的未处理异常:0xC0000005:访问冲突读取位置0x00000003。

调试器指向函数getBalance中的第15行作为抛出异常的位置。但是,我实际上不止一次调用此函数,它只会在第二次调用它时抛出异常。

int getBalance(int lineno){ // Funciton to convert strings in file to ints
    string balance;
//Getting information from the file about locations
int *pointer;
pointer = findNewLines();
static int linenopos[10];

for (int i = 0; i < 11; i++){
    linenopos[i] = *(pointer + i);
}

int balanceInt;

//Opening file
balanceFile.open("E:\\MoneyStuff\\balance.txt", ios::in | ios::out); //Exception is thrown here

//Getting Balances
balanceFile.seekg(linenopos[(lineno - 1)], ios::beg);
getline(balanceFile, balance);

balanceFile.close();

stringstream convert(balance);//Variable to convert string balance to integer balance

//Converting balance string to int
convert >> balanceInt;

//Setting balanceInt to 0 if the file doesn't exist
if (balanceInt < -30000)
    balanceInt = 0;

return balanceInt;
}

编辑:好的,所以我更正了我的代码中的部分,我试图访问不存在的数组中的元素,但我仍然得到相同的异常。当我尝试从先前创建的文件中读取时,似乎只会发生异常,那么它是否与权限有关?

注意:这是我第一次在这里提问,所以如果我需要给你们更多代码或更多信息,请告诉我!感谢

4 个答案:

答案 0 :(得分:4)

当您使用 10个元素声明数组时,这意味着您的索引从0变为9

将循环调整为:

for (int i = 0; i < 10; i++)

尝试访问数组中不存在的元素会导致奇怪的行为,崩溃就是其中之一。

至于由open()引起的异常,抓住它并打印到屏幕上以获得有关正在发生的事情的线索:

try {
    balanceFile.open("E:\\MoneyStuff\\balance.txt", ios::in | ios::out);
}
catch (const std::exception& e ) {
     std::cout << e.what() << std::endl;
}

答案 1 :(得分:1)

如果错误代码显示“访问冲突读取位置0x00000003”,则表示您正在尝试从null + 3读取值。

您的findNewLines()函数可能没有返回您想要的内容。

答案 2 :(得分:1)

您的for循环有11,请参阅:

static int linenopos[10];

for (int i = 0; i < 11; i++){

正确的是“10”:

static int linenopos[10];

for (int i = 0; i < 10; i++){

但最好的方法是在循环之前计算项目(你有可能升级你的向量),试试:

static int linenopos[10];

int size = sizeof(linenopos) / sizeof(linenopos[0]);//count items

for (int i = 0; i < size ; i++){

或使用矢量大小,如下所示:

const int size = 10;//vector size

static int linenopos[size];

for (int i = 0; i < size ; i++){

答案 3 :(得分:0)

在您的代码中

static int linenopos[10];
for (int i = 0; i < 11; i++)

你遍历在linenopos数组的末尾。

你应该

for (int i = 0; i != 10; ++i)