关于:'std :: bad_alloc'的实例

时间:2015-09-19 08:59:28

标签: c++

我读过其他帖子,但根本没有任何帮助, 这段代码没有错误,还有bad_alloc错误...

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char super[25];
    char name[25],last_name[25];
    int length;
    char *sym = "#";
    char *buffer;

    ofstream outfile;
    outfile.open("farses.dat",ios::app);

    cout << "Writing to the file" << endl;
    cout << "Enter your First Name: ";
    cin >> name;

    outfile << *sym;
    outfile << name << endl;

    cout << "Enter your Last Name: ";
    cin >> last_name;

    outfile << *sym;
    outfile << last_name << endl;

    cout << "Enter The Sentence : ";
    cin.getline(super,25);

    outfile << super << endl;

    outfile.close();

    ifstream infile;
    infile.open("frases.dat");
    infile.seekg(0, ios::end);
    length = infile.tellg();
    infile.seekg(0,ios::beg);
    buffer = new char[length];
    infile.read(buffer , length);

    cout << "\n\nReading from file \n\n" << endl;
    cout << buffer << endl;
    infile.close();

    return 0;
}

此代码在到达句子语句后终止.. getline()函数导致问题我猜但当我尝试其他两个语句(name和last_name),getline()时,它完美地工作..甚至将char限制降级为5但是在句子语句之后仍然抛出

1 个答案:

答案 0 :(得分:2)

Thumb规则,不要误以为你的代码没有错误。特别是当你明显出错。这种心态会让你无法找到错误,因为你看到的一切都是正确的。

您从未检查过您的流是否已打开,并且您在ofstream中输入了错误的文件名。

当您将数据写入文件名farses.dat然后尝试打开一个名为frases.dat的文件(我假设它是正确的名称,它意味着句子)时会发生什么。 您正在获取不存在的文件的光标位置ifstream::tellg,并且它失败,因此该函数返回-1。这是分配缓冲区之前的长度值。 当您分配缓冲区时,会出现bad_alloc异常(bad_array_new_length)。

检查文件是否已打开,至少可以节省一些调试时间。 像这样的东西,

ifstream infile;
infile.open("frases.dat");

if ( infile.is_open() ) {
    // File is open, do stuff (...)
    if ( length <= 0 ) {
        // Empty file / error, don't create buffer!!!
    }
    // (...)
    infile.close();
}
else {
    // Couldn't open file
}

编辑:修正了错误解释。