【发布时间】:2014-04-03 01:18:32
【问题描述】:
我正在尝试从文件中读取令牌并将它们放入数组中。我分多个步骤执行此操作,首先要弄清楚文件中有多少令牌,这样我就可以估计数组需要多大。我能够使用getline() 函数完成此操作。
FILE *crack, *dic;
crack = fopen(crack_file, "r");
dic = fopen(dic_file, "r");
char *lineptr;
size_t n;
int dic_word_count, crack_word_count, crack_line_count;
dic_word_count = crack_word_count = crack_line_count = 1;
while(getline(&lineptr, &n, dic) != EOF)
{
dic_word_count++;
}
char **dictionary = malloc(8*dic_word_count);
但是当我尝试用不同的文件做同样的事情时
while(getline(&lineptr,&n, crack) != EOF)
{
crack_line_count++;
}
printf("%d",crack_line_count);
永远不会到达打印语句。我真的不确定发生了什么,我只是想知道是否有人对正在发生的事情和可能的修复有任何想法。如果您想查看更多我的代码,请告诉我,我正在努力保持简洁但全面。提前致谢。
【问题讨论】:
-
您在调试器中对此进行了测试,对吧?当您在第二个 while 循环中实际打印行及其长度 in 时会发生什么?当您使用
dictionary分配删除代码并从一个文件循环移动到另一个文件循环时会发生什么?简而言之,如果任何,您采取了哪些步骤来实际调试这个? -
@WhozCraig 我已将问题缩小到代码的这一部分,因为当我将其注释掉时(可能看起来很古老),其他一切都很好。当我通过 gdb 运行它时,我在第一个 while 循环中遇到了分段错误,当我注释掉第二个循环时我没有得到。
-
你真的应该养成检查返回码的习惯。如果您的
FILE*之一是NULL,您将不会注意到,直到您的程序segaults。此外,假设EOF是-1也不是很好的风格,就像您检查getline返回错误/eof 条件一样。