Синтаксический анализ файла на c, извлечение определенной строки, если она существует

#c #parsing #fileparsing

#c #синтаксический анализ #анализ файлов

Вопрос:

У меня есть динамически обновляемый текстовый файл с именами людей, я хочу проанализировать файл, чтобы извлечь «Калеб» и строку, которая следует за его именем. Однако его имя не всегда может быть в списке, и я хочу учесть это.

Я мог бы сделать это на Java, но даже не уверен, что делать на C. Я мог бы начать с чтения текстового файла построчно, но тогда как мне проверить, является ли «Калеб» подстрокой строки, которую я только что прочитал, и обработать случай, когда это не так? Я хочу сделать это без использования внешних библиотек — какой метод был бы лучшим?

 Barnabas: Followed by a string
Bart: Followed by a string
Becky: Followed by a string
Bellatrix: Followed by a string
Belle: Followed by a string
Caleb: I want this string
Benjamin: Followed by a string
Beowul: Followed by a string
Brady: Followed by a string
Brick: Followed by a string

returns: "Caleb: I want this string" or "Name not found"
  

Ответ №1:

но тогда как мне проверить, является ли «Caleb» подстрокой строки

Суть вопроса, когда я его читаю. strstr выполняет свою работу.

 char *matchloc;
if ((matchloc = strstr(line, "Caleb:")) {
    // You have a match. Code here.
}
  

Однако в данном конкретном случае, который вы действительно хотите, начинается с Caleb, поэтому мы делаем лучше с strncmp :

 if (!strncmp(line, "Caleb:", 6)) {
    // You have a match. Code here.
}
  

Ответ №2:

Итак, если вы хотите проверить, существует ли пользователь caleb, вы можете просто создать strstr с вашим массивом строк, и если он существует, вы можете создать strtok, чтобы получить только строку!

Я не знаю, как вы открываете файл, но вы можете использовать getline для получения построчно!

Вы можете сделать что-то вроде этого:

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

int main(){

FILE *file;
char *fich="FILE.TXT";
char *line = NULL;
char *StringFile[100];
size_t len = 0;
ssize_t stringLength;
const char s[2] = ":"; //Divide string for this
char *token;
int check =0;
char *matchloc;


file=fopen(fich, "r"); 
    if(file==NULL){
        fprintf(stderr, "[ERROR]: cannot open file <%s> ", fich);
        perror("");
        exit(1);
    }

while((stringLength = getline(amp;line, amp;len, file)) != -1){
    if(line[strlen(line)-1] == 'n'){
        line[strlen(line)-1] = '';  //Removing n if exists
    }   

    if((matchloc = strstr(line, "Caleb:"))){
        check = 1;
        strcpy(*StringFile, line);
        token = strtok(*StringFile, s);

        while( token != NULL ) {
            token = strtok(NULL, s);
            printf("%sn", token);
            break;
        }
        break;
    }
}

if(check==0){
       printf("Name not foundn");
} 

    return 0;
}
  

В коде могут быть некоторые ошибки, но идея в том, что! когда находит имя, скопируйте строку в array и разделите ее.