如果不等于前一行,则打印每一行

时间:2016-04-03 03:23:39

标签: c function

我需要编写一个函数void process_file(FILE* f),该函数在一行中读取给定文件的所有输入,同时在内存中保留两条连续的行,如果它不等于以前的行,则将每行打印到标准输出读行。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MY_MAX_LINE 999

void process_file(FILE* f)
{
  char firstLine[MY_MAX_LINE + 1];
  char secondLine[MY_MAX_LINE + 1]; 

  while (1)
  {
    if (!fgets(firstLine, sizeof(firstLine), f))
      break;

    puts(firstLine);

    if (!fgets(secondLine, sizeof(secondLine), f))
      break;

    if (strncmp(firstLine, secondLine, sizeof(firstLine)))
      puts(secondLine);
  }

  if (!feof(f))
    perror("Problem reading from file"), exit(1);
}

int main(int argc, char **argv)
{
  FILE *f = fopen("text.txt", "r");

  if (!f)
    perror("text.txt"), exit(1);

  process_file(f);
  fclose(f);

  return 0;
}

我想知道我是否正确地做了这件事,如果这就是问题所在。

谢谢!

1 个答案:

答案 0 :(得分:1)

这是我将如何做到的。首先从2行数组开始,以便您可以使用索引选择当前行和上一行。

char line[2][MAXL];

然后声明两个索引。第一个索引ping是当前行的索引。另一个索引pong是上一行的索引。 pong被初始化为无效索引,因为文件中的第一行没有前导。

int ping = 0;     // index of the current line
int pong = -1;    // index of the previous line

然后你需要一个while循环来从文件中读取到当前行

while ( fgets(line[ping], MAXL, fp) != NULL )

现在我们必须决定:打印还是不打印。打印当前行有两种情况。首先,如果pong < 0,则该行是第一行。始终打印第一行。其次,如果该行与前一行不匹配(由strcmp确定),则打印该行。

if ( pong < 0 || strcmp(line[0], line[1]) != 0 )
    printf( "%s", line[ping] );

最后,我们需要更新索引以准备下一行。我们希望其中一个索引为0而另一个索引为1,并且它们应该在每次循环中交换。 pong是上一行的索引,因此我们将当前行的索引存储到pong。然后我们将ping从0切换到1,反之亦然。

pong = ping;
ping = 1 - ping;