从C中的文件中读取令牌

时间:2014-04-03 01:18:32

标签: c file token

我正在尝试从文件中读取令牌并将它们放在一个数组中。我在多个步骤中执行此操作,从确定文件中有多少令牌开始,这样我就可以估计出我需要多大的数组。我能够使用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);

永远不会达到print语句。我真的不确定发生了什么,我只是想知道是否有人对正在发生的事情和可能的解决方案有任何想法。如果您想查看更多我的代码,请告诉我,我正在努力保持这种简洁但彻底的内容。提前谢谢。

2 个答案:

答案 0 :(得分:0)

在调用line和...

之前,需要初始化

getline()

  

getline()在读取一行失败时返回-1(包括文件结束条件)。如果发生错误,则设置errno以指示原因。"。

使用-1,因为EOF不一定是-1。

Ref

char *lineptr = NULL;
size_t n = 0;
...
while(getline(&lineptr, &n, dic) != -1)

注意:健壮的代码将使用

size_t dic_word_count, crack_word_count, crack_line_count;
... 
printf("%zu", crack_line_count);

答案 1 :(得分:0)

我看到的问题:

  1. getline不是标准C库函数。我不知道你正在使用哪个平台,以及对内存分配和释放的期望是什么。我强烈建议使用标准C库函数fgets

  2. 如果getline期望指向预先分配的内存,那么就会出现问题,因为您没有分配任何内存。如果getline分配内存,则需要使用代码来释放该内存。我发现问题无论如何。

  3. 您正在为正在阅读的每一行增加dic_word_count,然后在8*dic_word_count的调用中使用malloc。您是否假设某些内容转换为8