gpt4 book ai didi

c - 如果不等于上一行则打印每一行

转载 作者:行者123 更新时间:2023-11-30 15:10:07 26 4
gpt4 key购买 nike

我需要编写一个函数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;
}

我想知道我这样做是否正确,以及这是否是问题所问的内容。

谢谢!

最佳答案

我会这样做。首先从 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;

关于c - 如果不等于上一行则打印每一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36381288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com