Нужна помощь в разборе "|"отдельная строка из файла - PullRequest
0 голосов
/ 23 апреля 2019

Мне нужно проанализировать файл, который будет выглядеть примерно так

String|OtherString|1234|0

String2|OtherString2|4321|1

...

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

    FILE *fp=fopen("test1.txt","r");
    int c;
    char str1[500];
    char str2[500];
    int num1=0;
    int num2;
    while((c=fgetc(fp))!=EOF){
        fscanf(fp, "%s|%s|%d|%d", &str1[0], &str2[0], &num1, &num2);
    }
    fclose(fp);

Это еще не все, но это разделы, относящиеся к моему вопросу.fscanf не работает, вероятно, потому что я написал это неправильно.Предполагается, что для str1 [500] должно быть установлено значение String, в данном случае для str2 - OtherString и т. Д. Однако, похоже, что fscanf ничего не делает.Буду очень признателен за некоторую помощь.

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

1 Ответ

2 голосов
/ 23 апреля 2019

strtok () в цикле будет работать для вас. Ниже приведен простой пример с очень малой обработкой ошибок и т. Д., Но он иллюстрирует концепцию ...

char strArray[4][80];
char *tok = NULL;
char *dup = strdup(origLine);
int i = 0;
if(dup)
{
    tok = strtok(dup, "|\n");
    while(tok)
    {
        strcpy(strArray[i], tok);
        tok = strtok(NULL, "|\n");
        i++;
    }
    free(dup);
}

Если вы читаете из файла, то поместите этот цикл в другой цикл while, который читает файл, строка за строкой. Функции, полезные для этого, будут включать fopen () , fgets () и fclose () . Еще одна особенность, которую следует учитывать для кода, который считывает данные из файла, - это определить количество записей (строк) в файле, который нужно прочитать, и использовать эту информацию для создания контейнера правильного размера, который будет заполняться результатами анализа. , Но это будет другой вопрос.

Примечание: fgetc () здесь не рекомендуется, поскольку он читает один char на цикл, и будет менее эффективным, чем использование fgets() для чтения строк из файла при использовании вместе с strtok().

Обратите внимание, в общем, чем более последовательно файл отформатирован с точки зрения количества полей, содержимого полей и т. Д., Тем менее сложным должен быть синтаксический анализатор. Обратное тоже верно. Менее согласованный формат входного файла требует более сложного синтаксического анализатора. Например, для введенных человеком данных строки требуемый синтаксический анализатор обычно более сложен, чем, например, используемый для компьютерного набора унифицированных линий.

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