Найдите конкретное число в текстовом файле и напечатайте остальную часть файла с этой точки C - PullRequest
0 голосов
/ 11 мая 2018

Итак, у меня есть этот текстовый файл с информацией о вещах, которые люди туда поместили, и есть это число, которое представляет дату, когда оно было опубликовано (дд / мм / гг).

Пример: Этот текстовый файлсодержит результаты определенных футбольных игр, которые выиграли сезон и где празднование

15042018 13:00
Marítimo Moreirense 1-1

15042018 14:00
Benfica Porto 0-1

16042018 13:00
Rio Ave Tondela 1-1

03052018 14:56 
Porto wins the season!

03052018 16:00
The celebration will be in Aliados

Теперь левые представят, что сегодняшняя дата - 03/05/2018 (соответствует последней дате, записанной в файле 03052018) и теперь я хочу напечатать остаток оттуда, включая строку, где я нахожу эту дату, например:

03052018 14:56 
Porto wins the season!

03052018 16:00
The celebration will be in Aliados

Мой код, я пытаюсь использовать fseek(), сначала я считаю n байтов доЯ нахожу дату, которая соответствует сегодняшней дате, и затем я иду к файлу, пропускающему n байтов, и печатаю остальное, но его ошибка:

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

int main()
{
    FILE *users_info;
    char datesearch[10];

    users_info = fopen("TDesporto.txt", "w+");
    int i=0;
    time_t currentTime;
    time(&currentTime);

    struct tm *myTime = localtime(&currentTime);
    int date = myTime->tm_mday*1000000 + myTime->tm_mon*10000+10000 + myTime- >tm_year+1900; //this is is going to give the number of today's date

    while(!(strcmp(date,datesearch))){ //cicle ends when I find the number (datesearch) that is equal to todays date and will count the bytes until that point
    fscanf(users_info, "%d", datesearch);
    i++;
    }
    fseek(users_info,i,SEEK_SET);//going to n bytes into the file and print the rest

    char line[100];
    while(fgets(line, 100, users_info) != NULL)
    {
    printf("%s\n", line);    
    }

    fclose(users_info);
    return 0;
}

РЕДАКТИРОВАТЬ: я забыл, есть эта часть, где я на самом деле долженраспечатайте его задом наперед, чтобы оно получилось вот так

03052018 16:00
The celebration will be in Aliados

03052018 14:56 
Porto wins the season!

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Чтобы извлечь строку даты, вы можете использовать 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().

0 голосов
/ 11 мая 2018

Похоже, вы пытаетесь использовать strcomp для сравнения int (date) со строкой (datesearch). Преобразование date в символьную строку должно решить проблему, хотя может быть проще преобразовать datesearch в int с использованием atoi, чтобы избежать необходимости иметь дело с длиной строки и терминальными байтами.

Также обратите внимание, что первые 0 в datesearch не будут отражены в целочисленном представлении date. Это также предполагает использование atoi, поскольку это устранит начальные 0 при преобразовании из строки в int.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...