【问题标题】:Reading tokens from a file in C从 C 中的文件中读取标记
【发布时间】: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 条件一样。

标签: c file token


【解决方案1】:

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);

【讨论】:

    【解决方案2】:

    我看到的问题:

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

    2. 如果getline 需要一个指向预分配内存的指针,那么就会出现问题,因为您没有分配任何内存。如果getline 分配内存,您需要有代码来释放该内存。无论哪种方式,我都看到了问题。

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

    【讨论】:

      猜你喜欢
      • 2013-05-09
      • 2010-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-10
      • 2012-02-26
      • 2014-04-02
      相关资源
      最近更新 更多