0

私の課題は、txtファイルから入力を取得し、それを構造体配列の一部に読み取ってから操作することですが、ファイルからの読み取りに問題があります。

私の構造は次のとおりです。

   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」に変更してもうまくいきません。代わりに、都市の一部が含まれます。

私は何を間違っていますか?それぞれのコード行を正しい精度でスキャンするには何を変更すればよいですか?

ありがとう。

4

2 に答える 2

0

一連の文字列、つまり %s %s %s として通りを読み取ることができます。次に、それらを strcat() で連結して 1 つの文字列にします。

これは一般的な解決策ではありません。3 つ以上の単語を含む道路 (例: "19 N 3rd street") は失敗するからです。しかし、あなたの任務にはそれで十分だと思います。実際のアプリケーションでは、フィールドは何らかの区切り文字 (通常はカンマ) で区切られます (.csv を参照)。あなたの申請書にはそれがないように見えるので、この方法でそれを行い、将来より良い課題を与えるように先生に伝えてください.

于 2013-05-12T21:51:04.407 に答える