2013-05-12 2 views
0

Мое назначение - взять ввод из файла 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» не работает. Вместо этого он включает часть города.

Что я делаю неправильно? Что я могу изменить для правильной проверки соответствующих строк кода?

Спасибо.

+0

Забудьте 'scanf()', используйте 'fgets()' (в любом случае безопаснее) и 'strtok_r()'. – 2013-05-12 20:45:40

+0

Спасибо. fgets, похоже, работает намного лучше. –

ответ

1
char first[7], initial, last[9], street[16], city[11], state[2], zip[5]; 

Размер символа не хватает, включая EOS, если вы хотите читать со строками (строка C).

изменение

typedef struct Employee { 
    char first[8], initial, last[10], street[17], city[12], state[3], zip[6]; 
    int age; 
    char sex; 
    int tenure; 
    float salary; 
} Employee; 

управляющий символ %s в зсапЕ чтение с пространственно-разделителями, указать размер и читать непрочитанных Charactor, следуют к примеру.

while(EOF!=fscanf(payfile,"%7s %c %9s %16[^\n] %11[^\n] %2s %5s %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++; 
    } 

Вы можете удалить, если это не требуется для конечных пробелов.

0

Вы можете прочитать улицу в виде последовательности строк, то есть% s% s% s. Затем объедините их с помощью strcat() в одну строку.

Это не общее решение, потому что улицы с более чем тремя словами (например, «19 N 3-я улица») потерпят неудачу. Но я подозреваю, что это достаточно хорошо для вашего задания. В реальном приложении поля будут разделены каким-то разделителем, обычно запятой (см. CSV). Так как это, кажется, не существует в вашем приложении, просто сделайте это так, а затем сообщите своему учителю, чтобы он дал вам лучшие задания в будущем.

Смежные вопросы