我需要编写一个函数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;
}
我想知道我是否正确地做了这件事,如果这就是问题所在。
谢谢!
答案 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;