在流错误上添加空终止符
add Null terminator on istream error
我正试图读取一个文本文件,其中包含字符串集合到对象数组中,并且我有输入问题。我得到一个错误,到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 );
第六,输入操作没有错误检查。您需要添加错误检查和错误处理。假设input
为std::istream
,则可以检查input.fail()
;it’s true
如果某个输入操作失败。
Sevent…哦,逻辑上应该有第七点,因为七比六更令人愉快。然而,我没有什么可说的与这第七点有关。
干杯,hth。
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 如何在C++中从两个单独的for循环中添加两个数组
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 如何仅为一个函数添加延迟
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 使用std::transform将一个范围的元素添加到另一个范围中
- 如何将更多文件夹添加到c++include路径
- 如何将元素添加到数组的线程安全函数?
- QT通过C++添加映射QML项目
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 如何将点击的信号和插槽添加到qt中的自定义按钮中
- 我收到以下错误:抛出'std::bad_alloc'实例后终止调用
- llvm构建器向基本块添加终止符
- 以这种方式初始化的 char 数组是否会自动添加空终止符?
- C++17 std::to_chars 是否在添加空终止符?
- 添加 NULL 以终止双指针
- 为 fstream 添加 NULL 终止符
- cin函数是否添加了在输入结束时终止的null
- 在流错误上添加空终止符