在流错误上添加空终止符

add Null terminator on istream error

本文关键字:终止 添加 错误      更新时间:2023-10-16

我正试图读取一个文本文件,其中包含字符串集合到对象数组中,并且我有输入问题。我得到一个错误,到istream这里

*_Str = _Elem();    // add terminating null character

我真的不太了解如何在c++中使用字符串,所以任何帮助都会很感激。

我代码:

char bird_name[MAX_LINE_LENGTH];
char* description =new char [MAX_LINE_LENGTH];
char* sound=new char [MAX_LINE_LENGTH];
int num_states= 0;
char* states[10];
bool valid = true;
char* state_name = new char [MAX_LINE_LENGTH];
for (int j =0; j<10; j++)
states[j]=new char [MAX_LINE_LENGTH];
char *input_filename = argv[1];
ifstream input(input_filename);
if (!input.is_open())
{
cerr << "Invalid filename: " << input_filename << endl;
system("pause");
return 1;
}

input.getline(bird_name, MAX_LINE_LENGTH);
char* state_num = new char [MAX_LINE_LENGTH];
while (strcmp(bird_name, "END") != 0) 
{
    input.getline(description, MAX_LINE_LENGTH);
    consume_newline(input);
    input.getline(sound, MAX_LINE_LENGTH);
    consume_newline(input);
    input.getline(state_num, MAX_LINE_LENGTH);
    num_states = int(state_num);
    consume_newline(input);
    for (int k = 0; k<num_states; k++)
        input.getline(states[k], MAX_LINE_LENGTH);
    consume_newline(input);
    consume_newline(input);
    birds[num_birds++] = new Bird(bird_name, description, sound, num_states, states);
    //birds[num_birds]->display();
    input.getline(bird_name, MAX_LINE_LENGTH);
}

您提到的违规代码,& help;

    *_Str = _Elem();    // add terminating null character

可能来自某个标准库源代码文件。

请注意,在您自己的代码中不应该使用以下划线后跟大写字母开头的标识符,因为它们是为实现保留的(如上面的代码)。

注释表明,当标准库代码将一整行输入读入缓冲区,并试图添加一个终止空字节时,事情出错了。

这反过来表明缓冲区太小,或者传递给标准库代码的缓冲区指针甚至是无效的。

我无法在您正在显示的代码中找到。而且我怀疑您正在显示的代码并不是显示问题的代码。请注意,对于未来:如果可能的话,在一毫秒前发布你测试过的完整代码& help;

无论如何,为了解决问题,没有必要确切地知道哪里和什么(详细地)出了问题。你可以采用"亚历山大式解决方案"。这个短语指的是亚历山大大帝,当他找不到任何绳子末端来解开一个真正的坏结时,就用剑把它切成两半。

所以考虑你的声明& help;

char* description =new char [MAX_LINE_LENGTH];

第一个明显的错误,就是使用了ALL UPPERCASE标识符。将其保留给宏。然后变成& help;

char* description =new char [max_line_length];

第二,使用原始指针和原始new,通常只是Bad™把它去掉。然后它看起来像& help;

char description[max_line_length];
第三,使用像这样的原始数组通常是一个很好的解决方案,但事实证明,这是用于可变长度字符串。对于这种用法,它只是Bad™相反,使用某个字符串类的对象,例如标准库std::string:
std::string description;

你需要包括[string]头,即#include <string>

第四,这个变量只在循环内使用,所以把声明移到循环内!

第五,对于std::string,您需要更改getline调用,目前& help;

input.getline(description, MAX_LINE_LENGTH);

使用[string]头中的独立getline函数,即& help;

std::getline( input, description );

第六,输入操作没有错误检查。您需要添加错误检查和错误处理。假设inputstd::istream,则可以检查input.fail();it’s true如果某个输入操作失败。

Sevent…哦,逻辑上应该有第七点,因为七比六更令人愉快。然而,我没有什么可说的与这第七点有关。

干杯,hth。