所以我一直在尝试打开我创建的文件,但是当我尝试打开文件时出现错误。 以下是调试器所说的内容:
std::basic_ios<char,std::char_traits<char> > = <Unable to read memory>
基本上发生的事情是,我第一次运行程序时运行正常,但第二次尝试读取先前创建的文件时崩溃。它引发了一个例外:
Project3.exe中0x012F1539处的未处理异常:0xC0000005:访问冲突读取位置0x00000003。
以下是抛出异常的函数:
int convert(string balance, int lineno){ // Funciton to convert strings in file to ints---------------------------------
//Getting information from the file about locations
int *pointer;
pointer = findNewLines();
static int linenopos[11];
try{
for (int i = 0; i < 11; i++){
linenopos[i] = *(pointer + i);
}
}
catch (const std::exception& e){
std::cout << e.what() << std::endl;
}
int balanceInt;
try {
balanceFile.open("E:\\MoneyStuff\\balance.txt", ios::in | ios::out);
}
catch (const std::exception& e) {
std::cout << e.what() << std::endl;
}
//Opening file
balanceFile.open("E:\\MoneyStuff\\balance.txt", ios::in | ios::out);
//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 * findNewLines(){ //Function to find the \n characters in the txt file----------------------------------------------
//Creating Variables for function
static int linenopos[11];//Vector to store line positions in
char c; //Variable for checking character value
int pos; //Variable for temporarily storing position
int lineno = 0; //Integer to tell which line to read
//Writing in first line position
linenopos[0] = 0;
lineno++;
balanceiFile.open("E:\\MoneyStuff\\balance.txt", ios::binary);
do{
balanceiFile.get(c);
if (c == '\n'){
pos = balanceiFile.tellg();
linenopos[lineno] = pos;
lineno++;
}
} while (balanceiFile.good());
//Resetting error flags
balanceiFile.clear();
return linenopos;
}
答案 0 :(得分:0)
您是否尝试过删除第二个balanceFile.open
声明?
我可能还会添加一个像if (balanceFile)
这样的控制语句,以便您知道自己正在阅读好的数据。如果用-g编译,你会得到错误所在的行号吗?
答案 1 :(得分:0)
有些事情会有所帮助:
决定是否要保持文件打开并只打开一次,或者如果要多次打开和关闭它并每次都关闭它。
修正&#39; balanceiFile&#39;的拼写。 (为什么要编译?)
存储找到的行数,并检查它是否超过数组的长度
检查请求的行是否小于或等于找到的行数。