【发布时间】:2014-06-18 03:25:01
【问题描述】:
每当我再次运行此程序时都会遇到错误。基本上它所做的是将一些信息写入文件,如果文件不存在则创建文件。但是,当它第二次运行时,它需要读取之前创建的文件,由于某种原因引发了异常,我得到了这个错误:
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;
}
编辑:好的,所以我更正了代码中我试图访问不存在的数组中的元素的部分,但我仍然遇到相同的异常。该异常似乎仅在我尝试从以前创建的文件中读取时发生,所以它可能与权限有关吗?
注意:这是我第一次在这里提问,所以如果我需要给你们更多代码或更多信息,请告诉我!谢谢
【问题讨论】:
-
除了你的主要问题之外的一些其他问题:你应该初始化
balanceInt,或者检查>>是否失败。正如你所拥有的,如果convert >> balanceInt失败(例如balance不包含可读整数),那么当你检查-30000时,你会访问一个未初始化的值。 -
在执行
linenopos[lineno - 1]之前,您还必须检查lineno > 0和lineno <= 10。如果您更改代码以便findNewLines返回vector<streampos>,那会好一千倍。那么就没有大小限制了,可以使用vector的.at()成员函数来避免越界访问。 -
嗨!我的回答解决了你的问题?如果是,请检查为“正确”,如果不是,请告诉我缺少什么。
标签: c++