Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在istream错误上添加空终止符_C++_Istream - Fatal编程技术网

C++ 在istream错误上添加空终止符

C++ 在istream错误上添加空终止符,c++,istream,C++,Istream,我试图将一个包含字符串集合的文本文件读取到一个对象数组中,但输入有问题。我得到了一个错误,它在这里进入了istream *_Str = _Elem(); // add terminating null character 我对C++中的字符串如何使用并不太了解,所以有任何帮助都可以理解。 我的代码: char bird_name[MAX_LINE_LENGTH]; char* description =new char [MAX_LINE_LENGTH]; char* sound=new

我试图将一个包含字符串集合的文本文件读取到一个对象数组中,但输入有问题。我得到了一个错误,它在这里进入了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);
}
char bird_name[MAX_LINE_LENGTH];
字符*描述=新字符[最大行长度];
字符*声音=新字符[最大行长];
int num_states=0;
字符*状态[10];
bool valid=true;
字符*状态\名称=新字符[最大行\长度];

对于(intj=0;j你提到的令人不快的代码

    *_Str = _Elem();    // add terminating null character
可能来自某个标准库源代码文件

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

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

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

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

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

请考虑你的声明…< /P>
char* description =new char [MAX_LINE_LENGTH];
现在,第一个明显的错误就是使用了一个全大写的标识符。将它保留给宏。然后它就变成了

char* description =new char [max_line_length];
其次,使用原始指针和原始
新指针通常是不好的™. 所以把它扔掉。然后它看起来像

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

std::string description;
您需要为此包含[string]标题,即
#include

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

第五,使用
std::string
,您需要更改
getline
调用,当前

input.getline(说明,最大行长);

要从[string]头使用独立的
getline
函数,即

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

七…哦,逻辑上这里应该有第七点,因为七是一个比六更令人愉快的数字。但是,我没有什么要说的,这将符合第七点


干杯&hth.,

您的代码没有您声称存在错误的那一行…使示例smalle和更完整将使此问题变得更好。您好,@matt。欢迎使用堆栈溢出。请提供一个简短、完整、可编译的程序来演示您遇到的问题。有关更多信息,请参阅。您的代码是堆栈溢出的一个示例在C++中,几乎所有你应该避免的东西都是:原始指针,
new
,下划线大写标识符。@Kerrek SB:真的,
new
?这不是有点太远了吗?+1对于其他所有东西来说。@Kerrek SB:另外,我看不出他使用标识符有任何错误。他指出的错误行来自一个实现,并且这就是为什么应该避免使用这些标识符,因为它们是为实现保留的。