从 C 中的文件中读取令牌



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

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

line需要在

调用getline()之前初始化,然后...

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

使用 -1

作为EOF不一定是 -1。

裁判

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. getline不是标准的 C 库函数。我不知道您使用的是哪个平台,以及对内存分配和释放的期望是什么。我强烈建议使用标准的 C 库函数fgets

  2. 如果getline需要一个指向预分配内存的指针,则存在问题,因为您没有分配任何内存。如果getline分配内存,则需要具有用于释放该内存的代码。无论哪种方式,我都看到了问题。

  3. 您正在为正在阅读的每一行递增dic_word_count,然后在调用malloc时使用8*dic_word_count。您是否假设某些东西可以转化为8

相关内容

  • 没有找到相关文章

最新更新