繁体   English   中英

来自ifstream的C ++字符串数组

[英]C++ string array from ifstream

我有一个程序,需要从文件中读取字符串数组。 该数组必须是C类型的字符串(char *或char [])。

使用以下代码,我得到一个错误的访问错误:

for (i = 0; i < MAX_WORDS && !inputFile.eof(); i++) {
    inputFile >> words[i];
}

单词声明为:

char *words[MAX_WORDS];

iostreams不会自动为您分配内存,您必须事先分配。 当前,您只有一个包含垃圾值的指针数组。

但是请注意,您不能在此处控制输入的长度。 最好暂时存储到C ++字符串中并分配适当大小的C字符串。

或者,您可以使用setw()操纵器来限制输入长度:

inputFile >> std::setw(allocatedWordLength-1) >> words[i];

您的声明

char *words[MAX_WORDS];

仅分配一个指针数组,不为缓冲区分配内存。 这些指针没有指向已分配的内存,因此当您写入这些地址时,会出现访问错误。

您需要分配一个缓冲区数组。 一种方法是声明一个二维数组:

char words[MAX_WORDS][MAX_WORD_LENGTH];

假设MAX_WORD_LENGTH设置为多长,则空终止符的单词可能加一。 然后您的循环应该工作了。

JohnMcG为您的迫在眉睫的问题提供了一个很好的答案,但是还有其他一些要注意的问题不会在评论中显示。 请记住,字符数组可以容纳一个比其长度小1个字符的字符串,因此请使用MAX_WORD_LENGTH + 1作为长度。 我还建议将这些字符串初始化为空字符串,以便在循环之前,每个字符串的开头都有一个“ \\ 0”。

字词是否有可靠的长度限制? 如果不是这样,问题将更多地与C风格的字符串有关(尽管不是C ++字符串)。 您必须分配指针(如您所愿),并在逐个字符读取时根据需要重新分配它们。 奇怪的东西,这是我建议使用malloc() / free() / realloc()而不是C ++内存管理的一种情况。

我认为您已经知道您正在阅读单词而不是行。 您的数组名称表明了这一点,但这是学生之间的常见错误。

您没有在for语句中声明i ,因此它是一个范围在外部的变量,这可能会在以后使用它的值。 如果是这样,请记住.eof()并不意味着程序已用完输入,而是意味着程序已尝试读取文件末尾。 如果文件以空格字符结尾(例如'\\ n'),它将读取最后一个单词,然后递增i ,但不读取任何内容。 如果不是,它将在读取最后一个单词的同时尝试越过文件末尾,并且不会再次递增i

如果您需要字数统计,则如上所述,您需要初始化内存,并且需要检查words[i]是否为空( strlen()是否过大,请检查\\0的第一个字符)。

数组中的每个字符串是文件中的一行吗? 您在使用std :: ifstream吗? 如果没有,请使用std :: getline。 getline读入std :: string,但是c_str()给您c_str直接使用或复制到您的数组中

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM