Чтобы извлечь строку даты, вы можете использовать strftime()
как
time_t t=time(NULL);
struct tm *a = localtime(&t);
strftime(d, 9, "%d%m%Y", a);
, где d
- строка.
В строке формата, используемой для strftime()
, %d
, %m
и %Y
, обозначаются день, месяц и год (в виде чисел) соответственно.
Затем вы можете найти первый экземпляр этой строки во входном файле, используя strcmp()
.
char line[200], str[30];
long pos[100], ctr=0;
for(i=0; fgets(line, sizeof(line), fin); ++i)
{
if(i%3==0)
{
if(sscanf(line, "%29s", str)!=1 )
{
printf("\nSomething went wrong.");
return 1;
}
if(strcmp(str, d)==0)
{
pos[ctr++]=ftell(fin)-strlen(line);
break;
}
}
}
где pos
- это массив, используемый для хранения местоположений в файле (полученный с использованием ftell()
), откуда чтение должно быть выполнено позднее, а ctr
используется для индексации этого массива.
После нахождения совпадения нам не нужно проверять дальнейшие совпадения, а просто записывать сообщения, с которых должно происходить чтение. Давайте сделаем это в другом цикле, как в
for(i+=1; fgets(line, sizeof(line), fin); ++i)
{
if((i+1)%3==0)
{
pos[ctr++]=ftell(fin);
}
}
После того, как все позиции будут записаны, мы будем использовать их для отображения вывода
for(i=ctr-1; i>=0; --i)
{
fseek(fin, pos[i], 0);
for(int j=0; j<2; ++j)
{
if(fgets(line, sizeof(line), fin)==NULL)
{
break;
}
printf("%s", line);
}
printf("\n");
}
И, как было сказано, date
в вашей программе является int
и не может использоваться в качестве аргумента strcmp()
.