Мое назначение - взять ввод из файла txt и прочитать его в частях массива struct, а затем обработать его, но у меня возникают проблемы с чтением из файла.Чтение из TXT-файла с использованием fscanf в C
моя структура выглядит следующим образом:
typedef struct Employee
{
char first[7], initial, last[9], street[16], city[11], state[2], zip[5];
int age;
char sex;
int tenure;
float salary;
} Employee;
и в моей основной: я определил MAX, чтобы быть 100
FILE *payfile;
Employee worker[MAX];
int i = 0, num;
float average;
payfile = fopen("payfile.txt","r");
while(!feof(payfile))
{
fscanf(payfile,"%s %c %s %s %s %s %s %d %c %d %f",
worker[i].first,&worker[i].initial,worker[i].last,worker[i].street,
worker[i].city,worker[i].state,worker[i].zip,&worker[i].age,&worker[i].sex,
&worker[i].tenure,&worker[i].salary);
i++;
}
здесь является текстовый файл, мы должны читать:
ADA A AGUSTA 33 BABBAGE ROAD LOVELACE GB 19569 28 F 2 350.50
ISSAC A ASIMOV 99 FICTION WAY AMHERST MA 63948 58 M 6 423.88
HUMPHRY R BOGART 71 SAM STREET HOLLYWOOD CA 48482 56 M 5 366.00
ALBERT G EINSTEIN 94 ENERGY WAY PRINCETON NJ 47474 67 M 8 780.00
EMMYLOU L HARRIS 66 COUNTRY ROAD NASHVILLE TN 72647 38 F 2 767.42
JAMES T KIRK 11 SPACE STREET VULCAN CA 82828 46 M 1 235.70
TED L KOPPEL 55 ABC PLACE WASHINGTON DC 37376 48 M 9 909.44
DAVID T LETTERMAN 14 WNBC AVENUE NEW YORK NY 19338 47 M 5 445.65
STEVIE R NICKS 31 MUSIC ROAD CHICAGO IL 23459 38 F 8 460.88
MONTY P PYTHON 76 SILLY STREET LONDON GB 80939 44 M 2 320.50
ROGER R RABBIT 15 LOONEY TOONS HOLLYWOOD CA 91343 24 M 4 259.53
SALLY W RIDE 21 COLUMBIA WAY HOUSTON TX 91123 30 F 9 707.80
ROD Q SERLING 11 TWLIGHT ZONE SAN DIEGO CA 93939 56 M 1 440.00
LUKE R SKYWALKER 43 MILKY WAY NEW YORK NY 12343 35 M 5 660.00
поэтому у меня проблемы с точностью fscanf. Чтобы проверить, что содержит рабочий, я использую printf («% s», рабочий [0] .first) и printf («% c», рабочий [0] .initial) ... и т. Д.
Когда я просматриваю первую строку в первой строке, я получаю ADA, затем просматриваю пробелы и получаю следующий символ, A. До сих пор. Затем я просматриваю пробел и беру следующую строку, которая возвращает AGUSTA. Но теперь я столкнулся с этой проблемой. Мне нужно получить 33 BABBAGE ROAD в рабочий [0] .street, но изменение параметра «% s» на «% 16c» не работает. Вместо этого он включает часть города.
Что я делаю неправильно? Что я могу изменить для правильной проверки соответствующих строк кода?
Спасибо.
Забудьте 'scanf()', используйте 'fgets()' (в любом случае безопаснее) и 'strtok_r()'. – 2013-05-12 20:45:40
Спасибо. fgets, похоже, работает намного лучше. –