0

我试图读取一个文件并使用 fscanf 来获取一些值并将其存储在一个数组中,但是在文件中,会有一些以“#”开头的行(例如 #this 只是一个命令),我想跳过他们我应该怎么做?那些包含#的行将出现在随机行中。我的一些代码在这里:

//do line counts of how many lines contain parameters 


while(!EOF) {
      fgets(lines, 90, hi->agentFile);
      count++;
      if (lines[0] == '#') {
          count--;
      }
  }
   //mallocing an array of struct.
  agentInfo* array = malloc(count*sizeof(agentInfo));
  for (i = 0; i < count; i++) {
      fscanf(hi->agentFile,"%d %d %c %s %c",&array[i].r,&array[i].c,
              &array[i].agent_name,&array[i].function[80],
              &array[i].func_par);

所以我需要添加一些东西,这样我就可以跳过以'#'开头的行,如何?

4

1 回答 1

3

你的 EOF 测试是错误的。您还需要在fgets()循环和fscanf()循环之间倒回文件。并且您需要fscanf()用第二个fgets()循环替换循环sscanf()来读取数据。或者您需要在读取文件一次时随时分配内存。不过,让我们稍后再说:

while(fgets(lines, sizeof(lines), hi->agentFile) != EOF)
{
      if (lines[0] != '#')
          count++;
}
agentInfo *array = malloc(count*sizeof(agentInfo));
if (array != 0)
{
    int i;
    rewind(hi->agentFile);
    for (i = 0; fgets(lines, sizeof(lines), hi->agentFile) != EOF && i < count; i++)
    {
        if (lines[0] != '#')
        {
            if (sscanf(lines, "%d %d %c %s %c",&array[i].r,&array[i].c,
                     &array[i].agent_name,&array[i].function[80],
                     &array[i].func_par) != 5)
                ...format error in non-comment line...
        }
    }
    assert(i == count);  // else someone changed the file, or ...
}

请注意,这将检查内存分配错误和非注释行的格式错误。

于 2013-09-20T15:56:47.720 回答