C++ Project3.exe中0x00C61540处未处理的异常:0xC0000005:访问冲突读取位置0x00000003
每当再次运行此程序时,我都会遇到一个错误。基本上,它所做的是将一些信息写入文件,如果文件不存在,则创建该文件。但是,当它第二次运行时,它需要读取以前创建的文件,由于某种原因,该文件会引发异常,我得到以下错误: Project3.exe中0x00C61540处的未处理异常:0xC0000005:访问冲突读取位置0x00000003 调试器指向函数getBalance中的第15行作为引发异常的位置。然而,实际上我不止一次调用这个函数,它只在我第二次调用它时抛出异常C++ Project3.exe中0x00C61540处未处理的异常:0xC0000005:访问冲突读取位置0x00000003,c++,C++,每当再次运行此程序时,我都会遇到一个错误。基本上,它所做的是将一些信息写入文件,如果文件不存在,则创建该文件。但是,当它第二次运行时,它需要读取以前创建的文件,由于某种原因,该文件会引发异常,我得到以下错误: Project3.exe中0x00C61540处的未处理异常:0xC0000005:访问冲突读取位置0x00000003 调试器指向函数getBalance中的第15行作为引发异常的位置。然而,实际上我不止一次调用这个函数,它只在我第二次调用它时抛出异常 int getBalance(in
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;
}
int-getBalance(int-lineno){//将文件中的字符串转换为int的函数
弦天平;
//从文件中获取有关位置的信息
int*指针;
指针=findNewLines();
静态int-linenopos[10];
对于(int i=0;i<11;i++){
linenopos[i]=*(指针+i);
}
整数平衡整数;
//打开文件
balanceFile.open(“E:\\MoneyStuff\\balance.txt”,ios::in | ios::out);//这里抛出异常
//取得平衡
balanceFile.seekg(linenopos[(lineno-1)],ios::beg);
getline(余额文件、余额);
balanceFile.close();
stringstream convert(balance);//将字符串余额转换为整数余额的变量
//将平衡字符串转换为int
转换>>平衡点;
//如果文件不存在,请将balanceInt设置为0
如果(余额<-30000)
平衡点=0;
返回平衡点;
}
编辑:好的,我更正了代码中试图访问数组中不存在的元素的部分,但仍然得到相同的异常。只有当我尝试读取以前创建的文件时,才会出现异常,所以这可能与权限有关吗
注意:这是我第一次在这里提问,所以如果我需要给你们更多的代码或信息,请告诉我!谢谢你的代码
static int linenopos[10];
for (int i = 0; i < 11; i++)
当您声明一个包含10个元素的数组时,这意味着您的索引从
0
到9
将回路调整为:
for (int i = 0; i < 10; i++)
如果错误代码是“访问冲突读取位置0x00000003”,则表示您正在尝试从null+3读取值
您的findNewLines()函数可能没有返回所需的内容。for循环有
11
,请参阅:
static int linenopos[10];
for (int i = 0; i < 11; i++){
static int linenopos[10];
对于(int i=0;i<11;i++){
正确的答案是“10”:
static int linenopos[10];
对于(int i=0;i<10;i++){
但最好的方法是在循环前计算项目数(如果有机会升级向量),请尝试:
static int linenopos[10];
int size=sizeof(linenopos)/sizeof(linenopos[0]);//计数项目
对于(int i=0;i
或者使用向量大小,如下所示:
const int size = 10;//vector size
static int linenopos[size];
for (int i = 0; i < size ; i++){
const int size=10;//向量大小
静态int linenopos[大小];
对于(int i=0;i
从技术上讲,它可以做任何事情,不仅仅是崩溃,而是+1,因为这几乎可以肯定是根本原因。感谢您提供的信息,我不知道当您声明它时,它不从0开始计数……但是,我尝试了这一点,它仍然抛出相同的异常。而且,它只发生在我从创建的文件读取时,所以我认为这不是问题除了您的主要问题之外,这个问题还有一些其他问题:您应该初始化balanceInt
,或者检查>
是否失败。如果convert>>balanceInt
失败(例如balance
不包含可读的整数)然后,当您检查-30000
时,您将访问一个未初始化的值。您还必须检查lineno>0
和lineno Hi!我的答案解决了您的问题?如果是,请检查为“正确”,如果不是,请告诉我缺少什么。请参阅了解如何在您的帖子中设置代码格式。
static int linenopos[10];
for (int i = 0; i < 11; i++){
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++){