Найти повторяющуюся строку в потоке ввода-вывода -C?

Я совершенно новичок в C. Я пытаюсь написать код, который находит строку в потоке ввода-вывода, и я не понимаю, что я делаю неправильно. Я знаю, что ошибка, вероятно, в большом цикле while (в коде ниже). Я хочу, чтобы функция возвращала местоположение в байтах от начала потока и -1, если по какой-то причине происходит сбой. Он просто возвращает -1 для любого файла, на котором я его пробую.

long find_string(const char *str, const char *filename, long offset)
{
FILE *f = fopen(filename, "r");
if (!f){
    return -1;
}

int s=0,c;

c = fgetc(f);
if(c == EOF){
    return -1;
}

char *check = malloc(sizeof(char));

fseek(f, 0L, SEEK_END); // Sees and stores how long the file is
long sz = ftell(f);
fseek(f, 0L, SEEK_SET);

if(fseek(f, offset,SEEK_SET) != 0){ // finds the position of offset
    return -1;
}


while(fgetc(f) != EOF){
    c = fgetc(f);
    if(c == str[0] && ftell(f) < sz){
        check[0] = c;
        offset = ftell(f);
        }

        s++;
        for (unsigned int r=1; r < (strlen(str));r++){
            c = fgetc(f);
            if(c == str[s]){
                    check = realloc(check, sizeof(char)*s);
                    check[s] = c;
                    s++;
            }                   
        }

    if(strcmp(check, str)==0){
        free(check);
        fclose(f);
        break;

    }
    else{
        check = realloc(check, sizeof(char));
        offset = -1;
    }
}
return offset;}  

Любая помощь с благодарностью

2 ответа

Это было бы намного проще, если бы вы просто отобразили в памяти весь файл и запустили на нем стандартный алгоритм поиска строк.

Для отображения памяти, см.: Linux - Memory Mapped File

Для кода поиска строки, смотрите: strstr () для строки, которая НЕ заканчивается на нуль

Пожалуйста, проверьте строки с обновленным комментарием

long find_string(const char *str, const char *filename, long offset)
{
FILE *f = fopen(filename, "r");
if (!f){
    return -1;
}

int s=0,c;

c = fgetc(f);
if(c == EOF){
    return -1;
}

char *check = malloc(sizeof(char));

fseek(f, 0L, SEEK_END); // Sees and stores how long the file is
long sz = ftell(f);
fseek(f, 0L, SEEK_SET);

if(fseek(f, offset,SEEK_SET) != 0){ // finds the position of offset
    return -1;
}

    c = fgetc(f); // Updated
while(c != EOF){ // Updated
    if(c == str[0] && ftell(f) < sz){
        check[0] = c;
        offset = ftell(f);
        }

        s++;
        for (unsigned int r=1; r < (strlen(str));r++){
            c = fgetc(f);
            if(c == str[s]){
                    check = realloc(check, sizeof(char)*s);
                    check[s] = c;
                    s++;
            }                   
        }

    if(strcmp(check, str)==0){
        free(check);
        fclose(f);
        break;

    }
    else{
        check = realloc(check, sizeof(char));
        offset = -1;
    }
    c = fgetc(f); //Updated
}
return offset;}  

так как вы используете fgetc в условии и в начале просмотра, вы фактически сравниваете второй символ файла с первым символом строки str. обновить и проверить.

Другие вопросы по тегам