当前位置: 首页 > 知识库问答 >
问题:

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

徐皓君
2023-03-14

我的任务是从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;

在我的主要观点中:我定义最大值为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的准确性方面遇到了一些问题。要检查worker包含的内容,我使用了printf(“%s”,worker[0]。first)和printf(“%c”,worker[0]。initial)。。。等

当我扫描第一行中的第一个字符串时,我得到ADA,然后扫描空白,得到下一个char,A。到目前为止很好。然后我扫描空白,并获取下一个字符串,返回AGUSTA。但是现在我遇到了这个问题。我需要让33 BABBAGE ROAD进入工人[0]. street,但是将参数"%s"更改为"c"不起作用。相反,它包括城市的一部分。

我做错了什么?我应该改变什么来正确地扫描相应的代码行?

谢谢

共有2个答案

匡祖鹤
2023-03-14

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

这不是一个通用的解决方案,因为超过3个单词的街道(例如“19 N第三街”)将失败。但我想这对你的任务来说已经足够了。在实际应用程序中,字段将用某种分隔符分隔,通常是逗号(请参见.csv)。既然你的申请表中似乎不存在这种情况,就这样做,然后告诉你的老师将来给你更好的作业。

燕光熙
2023-03-14
char first[7], initial, last[9], street[16], city[11], state[2], zip[5];

如果要使用字符串(C字符串)读取,则字符大小(包括EOS)不够。

改为

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在以空格分隔的scanf读取中,指定读取大小和未读字符,例如如下所示。

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

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

 类似资料:
  • 我希望你帮助我理解我应该如何做以下事情: 我有一个包含由空格“”分隔的整数的文件。我需要读取所有整数,对它们进行排序,并将它们作为字符串写入另一个文件。我写了一个代码,但是我一个字符一个字符地读,把这个单词放在一个字符子数组[Max_Int]中,当我遇到“”时,我把这些字符,现在是一个字符串,在原子化后放到另一个主Int数组中,直到到达文件的末尾,一个字符串接一个字符串,然后我对它们进行排序并将它

  • 我正试图编写一个程序,读取网络中相互交互的节点列表。它以以下格式写入文本文件: 这表示节点1与节点2和节点3交互,节点2仅与节点3交互,等等。 该程序将能够读取该文件,并将删除任何重复的交互,并且如果我输入节点的名称,将能够向我返回节点与其他节点的交互次数。然而,我对Java非常陌生,我首先尝试让它读入文件,尽管我的代码目前没有读入文件。以下是我迄今为止的代码: 任何关于如何解决此问题的帮助都将不

  • 我的项目中有这样一段代码: 没有错误,应用程序运行正常,但是变量中从来没有任何文本,我确信txt文件中有文本! 我已经尝试过不同的方法来读取文本文件(使用BufferedReader、Scanner、FileInputStream和FileReader),但都不起作用。 另外,我几乎可以肯定问题不在变量中,因为我尝试通过代码(使用运行时)打开文件,它正常打开了正确的文件。 好的,我尝试添加,但是仍

  • 所以,我试图让我的程序从文本文件中读入一个结构数组,它编译得很好,但看起来并没有真正读入值?...我不知道为什么。这是代码的相关部分: 这是txt文件(标题:Planets.txt) 水星120 50 500 12.1 30 2金星120 50 500 29.1 30 6地球120 50 500 32.2 30 7月亮120 15 50 5.3 30 2火星120 50 500 12.2 30 4

  • 我正在编写一个程序,使用一个文件中的30个分数,计算出最低、最高和平均分数。我很难理解如何编写循环语句来读取每个等级并更新最低/最高等级,并在读取下一个等级之前将该值添加到总和。 谢谢想出来了:

  • 问题内容: 我正在研究一个Java程序,该程序逐行读取文本文件,每个文本文件都有一个数字,将每个数字都将其扔到数组中,然后尝试使用插入排序对数组进行排序。我需要有关程序读取文本文件的帮助。 我收到以下错误消息: 我的“ src”,“ bin”和主项目文件夹中有.txt文件的副本,但仍找不到该文件。我正在使用Eclipse。 问题答案: 你必须把文件扩展名放在这里