【问题标题】:How I can skip a blank line in an input file when using strtok?使用 strtok 时如何跳过输入文件中的空行?
【发布时间】:2011-06-08 04:38:19
【问题描述】:

我想使用 strtok 传递文件的行;这些值以逗号分隔。然而,strtok 也会读取只包含空格的空行。在这种情况下不应该返回一个空指针吗?

我怎样才能忽略这样的一行?我尝试检查NULL,但如上所述它不起作用。

【问题讨论】:

  • 输入文件的格式是什么?
  • @cnicutar 这是一个纯文本文件,每行有两个值,用逗号分隔。
  • 第一次调用strtok 可能会将整行作为第一个标记返回。为什么不检查行内容,从文件中读取它,然后用strtok 分割它。
  • @pascal 我想知道是否有办法使用 strtok 本身来做到这一点。但看来我不得不按照你的建议去做。想知道为什么 strtok 在给定的分隔符不存在时读取该行。
  • 一行"foo"可以理解为"foo,,,,"的缩写。没有分隔符,整行内容为第一项。

标签: c strtok fileparsing


【解决方案1】:
void function_name(void)
{

  const char delimiter[] = ",";
  char line_read[9000];
  char keep_me[9000];
  int i = 0;

  while(fgets(line_read, sizeof(line_read), filename) != NULL)
  {
      /*
       * Check if the line read in contains anything
       */
      if(line_read != NULL){
          keep_me[i] = strtok(line_read, delimiter);
          i++;
          }
  }

}

所以解释一下。

您正在使用 while 循环读取文件,该循环将整个文件逐行 (fgets) 读入数组 line_read

每次读取一行时,它都会检查它是否包含任何内容(NULL 检查)。

如果它确实包含某些内容,则使用strtok 对其进行解析并将其读入keep_me,否则它将保留在您显然不会在程序中使用的line_read 数组中。

【讨论】:

  • line_read != NULL 永远为真:line_read 是一个数组
  • 这个答案有几个问题,如果我错了,请纠正我。 (1) 是@pmg 提到的。 line_read 不是检查 NULL 的指针。 (2) strtok 返回一个char *,你将它分配给一个存储字符的内存位置。 (3) 调用strtok 一次不足以读取该行中的几个值。
  • @Dulanja:你是对的;您注意到的所有问题都需要修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-05
相关资源
最近更新 更多