使用fstream </unable>时,<unable =“”“read =”“memory =”“>

时间:2014-06-19 14:09:58

标签: c++

所以我一直在尝试打开我创建的文件,但是当我尝试打开文件时出现错误。 以下是调试器所说的内容:

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;
}

2 个答案:

答案 0 :(得分:0)

您是否尝试过删除第二个balanceFile.open声明?

我可能还会添加一个像if (balanceFile)这样的控制语句,以便您知道自己正在阅读好的数据。如果用-g编译,你会得到错误所在的行号吗?

答案 1 :(得分:0)

有些事情会有所帮助:

  1. 决定是否要保持文件打开并只打开一次,或者如果要多次打开和关闭它并每次都关闭它。

  2. 修正&#39; balanceiFile&#39;的拼写。 (为什么要编译?)

  3. 存储找到的行数,并检查它是否超过数组的长度

  4. 检查请求的行是否小于或等于找到的行数。