繁体   English   中英

在C中使用fscanf从.txt文件读取

[英]Reading from .txt file using fscanf in C

我的任务是从txt文件中获取输入,然后将其读入struct数组的各个部分,然后对其进行操作,但是从文件中读取时遇到了麻烦。

我的结构如下:

   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++;
 }

这是我们要从中读取的txt文件:

    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”,worker [0] .first)和printf(“%c”,worker [0] .initial)...等等。

当我扫描第一行中的第一个字符串时,我得到了ADA,然后扫描了空格并得到了下一个字符A。到目前为止,还不错。 然后,我扫描空白并获取下一个字符串,该字符串返回AGUSTA。 但是现在我遇到了这个问题。 我需要使33 BABBAGE ROAD进入worker [0] .street,但是将参数“%s”更改为“%16c”无效。 相反,它包括部分城市。

我究竟做错了什么? 如何更改以正确的精度扫描相应的代码行?

谢谢。

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

如果要使用字符串(C字符串)读取,包括EOS在内的char大小是不够的。

改成

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;

例如,在scanf读取中使用空格分隔控制字符%s ,指定读取大小和未读取字符。

    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++;
    }

如果不需要尾随空格,则可以删除。

您可以将街道读为一系列字符串,即%s%s%s。 然后将它们与strcat()连接成一个字符串。

这不是通用解决方案,因为包含3个以上字词的街道(例如“ 19 N 3rd street”)将失败。 但我怀疑这对您的任务已经足够了。 在实际应用中,这些字段将使用某种分隔符(通常是逗号)分隔(请参见.csv)。 由于您的应用程序中似乎并不存在这种情况,因此请按照这种方式进行操作,然后告诉您的老师将来给您更好的作业。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM