Чтение из txt файла в c - PullRequest
0 голосов
/ 19 июня 2020

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

Мой текстовый файл имеет следующий формат: текстовый файл Мне нужно сохранить имя человека, которое находится после "." и перед ":" символом:

  1. Педро Мендес: 45

Например, в этой строке мне нужно сохранить «Педро Мендес».

Мой код не работает должным образом:

FILE *f;
f = fopen(filename,"rt");
if(f==NULL){
    printf("Erro no acesso ao ficheiro.\n");
    return NULL;
}

(...)

while(fgetc(f) != '.'); // finds the point
fscanf(f," %s %s",pnome,unome); //saves the name of a person
while(fgetc(f) != ':');
fscanf(f,"%d",&tempo);

Я должен получить "Pedro Mendes", но у меня "Pedro Mendes:", и на время я должен получить 45, но у меня 46 (я считаю, что читает со следующей строки).

Если кто есть ответы, которые были бы замечательны, спасибо.

Ответы [ 2 ]

0 голосов
/ 19 июня 2020

Функция семейства scanf известна как синтаксический анализатор для бедняков . Он предназначен для прямой обработки элементов, разделенных пробелами (конец строки здесь является пробелом). В любом другом контексте его можно или не использовать, но только с большой осторожностью, а другие функции библиотеки часто работают лучше (в смысле более простого или более надежного кода).

IIU C, у вас есть:

  • то, что вы игнорируете, с точностью до точки (.)
  • точка
  • строка, представляющая имя с точностью до двоеточия (:)
  • двоеточие
  • число, представляющее время

Если вас не беспокоит правильное разделение строк, вы можете использовать спецификатор формата []:

FILE *f = fopen(filename,"rt");
if (f == NULL) {
    ...
}
int cr = fscanf(f, "%*[^.].%[^:]:%d", nome, &tempo);
if (cr != 2) {
    ...
}

Вы потеряли разделение pnome, unome, но хорошая новость в том, что он принимает Juan Pedro Mendez y Garcia ...

0 голосов
/ 19 июня 2020

Вы можете удалить ':' следующим образом:

char *c = strchr(unome, ':');
if(c)
    *c = '\0';

Что касается чтения неправильного числа, удалите while(fgetc(f) != ':');, поскольку ':' сохраняется в unome.

...