2010-05-12 90 views
0

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

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

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

话被声明为:

char *words[MAX_WORDS]; 
+0

可能要检查其他错误位(失败等) – Tom 2010-05-12 21:28:44

+0

什么是inputFile? – Patrick 2010-05-12 21:31:06

+0

inputFile是ifstream,如标题所示。 – 2010-05-12 22:07:49

回答

2

输入输出流不会自动为您分配内存,你必须事先分配。您目前只有一个包含垃圾值的指针数组。

但请注意,您不控制输入的长度。暂时存储到C++字符串中并分配适当大小的C字符串将是优选的。

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

我不允许在我的程序中使用C++字符串(根据我的好战老师的意愿)。 setw似乎并不适合我。我读过它在iomanip中定义的地方,但当我尝试使用它时遇到错误。 – 2010-05-12 22:14:52

+0

@David:你有没有#include '?您可以将错误添加为问题的更新,或者打开一个关于iomanip问题的新问题。 – 2010-05-12 22:31:58

+0

@老师 - 为什么不呢? (别担心,这是一个反问的问题。) – jmucchiello 2010-05-13 15:21:59

0

是阵列中的每个字符串的文件中的行:

另外,您可以使用setw()操纵限制输入长度?你使用std :: ifstream吗?如果不这样做,然后使用std :: getline。函数getline读入的std :: string但是c_str()给你,好了,一个c_str直接使用或复制到到您的阵列

1

你的宣言

char *words[MAX_WORDS]; 

只分配一个指针数组,而不是记忆缓冲区。这些指针并不指向分配的内存,因此当您写入这些地址时,会出现访问错误。您需要分配缓冲区数组。一种方法是声明一个二维数组:

char words[MAX_WORDS][MAX_WORD_LENGTH]; 

假设MAX_WORD_LENGTH设为然而长你的话都不可能加一个空终止符。然后你的循环应该工作。

1

JohnMcG为您的直接问题提供了一个很好的答案,但还有其他一些问题需要关注,因为这些问题不适合发表评论。请记住,字符数组可以容纳比其长度小一个字符的字符串,因此请使用MAX_WORD_LENGTH + 1作为长度。我还建议将这些字符串初始化为空字符串,以便在循环前面的每个字符串的开始处有一个'\ 0'。

有没有可靠的字数限制?如果没有,问题变得更多地涉及C风格的字符串(尽管不是C++字符串)。你必须分配指针(就像你所拥有的一样),并在按字符读取字符的同时根据需要重新分配它们。烦躁的东西,这是我建议使用malloc()/free()/realloc()而不是C++内存管理的一种情况。

我假设你已经意识到你在阅读文字而不是线条。你的数组名称暗示了这一点,但这是学生们常见的错误。

您在for语句中没有声明i,因此它是一个范围外的变量,这可能会导致您稍后可能使用它的值。如果是这样,请记住.eof()并不意味着程序已经用完输入,这意味着程序试图读取文件的结尾。如果文件以空白字符结尾(如'\ n'),它将读取最后一个字,然后增加i并且什么也不读。如果没有,它将尝试在读取最后一个字时读取文件的结尾,并且不会再次递增i

如果你需要的话的计数,那么,你需要有初始化内存,如上面提到的,你需要检查words[i]是否为空(strlen()是矫枉过正,检查的第一个字符\0)。