gpt4 book ai didi

c++ - 在 istream 错误上添加 Null 终止符

转载 作者:行者123 更新时间:2023-11-28 08:15:30 26 4
gpt4 key购买 nike

我正在尝试将包含字符串集合的文本文件读取到对象数组中,但输入有问题。我收到一个错误,该错误会转到此处的 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);
}

最佳答案

你提到的违规代码,......

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

大概来自一些标准库源代码文件。

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

注释表明,当标准库代码已将完整的输入行读入缓冲区并尝试添加终止空字节时,事情就会出错。

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

我无法在您显示的代码中找到它。我怀疑您显示的代码不是出现问题的代码。请注意,对于 future :如果可能的话,发布您在一毫秒前测试过的完整代码……

无论如何,为了解决问题,没有必要(详细地)确切地知道哪里出了问题以及出了什么问题。您可以只使用“亚历山大解决方案”。这个表达指的是亚历山大大帝,当他找不到任何绳头开始解开一个真正的 Bad Knot™ 时,他只是用他的剑将它切成两半。

所以考虑你的声明......

char* description =new char [MAX_LINE_LENGTH];

现在第一个明显的错误是使用了 ALL UPPERCASE 标识符。为宏保留它。然后就变成了……

char* description =new char [max_line_length];

其次,使用原始指针和原始new , 通常只是 Bad™。所以摆脱它。然后它看起来像......

char description[max_line_length];

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

std::string description;

您需要为此包含 [string] header ,即 #include <string> .

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

第五,用std::string ,您需要更改 getline打电话,目前……

<德尔> input.getline(description, MAX_LINE_LENGTH);

使用独立的getline来自 [string] header 的函数,即......

std::getline( input, description );

第六,输入操作没有错误检查。您需要添加错误检查和错误处理。假设input作为std::istream , 然后你可以检查 input.fail() ;这是true如果某些输入操作失败。

七……哦,按道理这里应该是第七点,因为七比六更令人愉悦。但是,我无话可说,这符合第七点。

干杯,

关于c++ - 在 istream 错误上添加 Null 终止符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7856924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com