Чтение данных через «;» из файла - PullRequest
0 голосов
/ 07 сентября 2018

Я пытаюсь прочитать данные из файла, отформатированного с ;. Данные всегда будут такими:

char[];int;int%;int

char[] может иметь любое количество пробелов, и % следует игнорировать при чтении данных.

Я использую fscanf() (мне разрешено использовать только это) для чтения данных из файла.
Прямо сейчас мой код для этой части:

fscanf(file, "%[^;]%d%d%d", f_name, &f_id, &f_score, &f_section_num) != EOF)

Есть ли регулярное выражение для того, что мне нужно? Или как мне исправить мой fscanf?

Ответы [ 3 ]

0 голосов
/ 08 сентября 2018

Вы можете прочитать файл, используя fscanf с этой строкой формата:

"%[^;];%d;%d%%;%d"
  • %[^;]: чтение до первого ;
  • ;:игнорировать ;
  • %d: читать одно целое число
  • ;: игнорировать ;
  • %d: читать одно второе целое число
  • %%: игнорировать %
  • ;: игнорировать ;
  • %d: читать третье целое число

Не забудьте проверить количество успешных конверсий, сделанных fscanf, протестировав fscanf(...) == 4

Так код будет выглядеть так:

FILE *f = fopen(...);
char name[64];
int i, integers[3];

while (fscanf(f, "%[^;];%d;%d%%;%d", name, &integers[0], &integers[1], &integers[2]) == 4)
{
    printf("name is %s\n", name);
    for (i = 0; i < 3; ++i)
    {
        printf("i[%d] = %d\n", i, integers[i]);
    }        
}
fclose(f);
0 голосов
/ 08 сентября 2018

Вы также можете использовать strtok(). Если, например, вы используете структуру для каждой записи следующим образом,

typedef struct {
    char name[64];
    int id, score, section_num;
} entry_t;

следующее будет читать каждую строку файла следующим образом.

char line[128] = {'\0'};
char *field = NULL;
entry_t entry;

while (fgets(line, sizeof(line), fp)) {
    field = strtok(line, ";");
    if (!field || strlen(field) > sizeof(entry.name)) continue;
    strcpy(entry.name, field);
    field = strtok(NULL, ";");
    if (!field) continue;
    entry.id = atoi(field);
    field = strtok(NULL, ";%");
    if (!field) continue;
    entry.score = atoi(field);
    field = strtok(NULL, ";");
    if (!field) continue;
    entry.section_num = atoi(field);
    // Do whatever you need with the entry - e.g. print its contents
}

Для краткости я удалил некоторый необходимый шаблонный код. См. http://codepad.org/lg6BJ0hk для полного примера.

Вы можете использовать strtol() вместо atoi(), если вам нужно проверить результаты целочисленных преобразований.

0 голосов
/ 08 сентября 2018

Следующий код позволит вам читать данные, отделенные ; от вашего файла:

char msg[100];
int  a;
char b[100];
int  c;

fscanf(fptr, "%[^;];%d;%[^;];%d", msg, &a, b, &c);
printf("%s\n %d\n %d\n %d\n", msg, a, atoi(b), c);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...