【问题标题】:Skipping lines in a file in c在c中的文件中跳过行
【发布时间】:2018-05-07 15:18:33
【问题描述】:

我正在尝试读取文件的内容,将它们插入到结构的字段中,然后打印出值。但它似乎忽略了患者数据的一半,因为它每次都会跳过包含数据的行。

Sophia Jackson 1234 141.0 1.1 

Emma Aiden 5432 142.0 1.2

Olivia Lucas 5685 143.0 1.3

Ava Liam 5672 144.0 1.4

Mia Noah 3467 145.0 1.5

Isabella Ethan 8654 146.0 1.6

Riley Mason 2567 147.0 1.7

Aria Caden 6794 148.0 1.8

名称的格式是这样的,除了它们之间不是换行符

while(1) {
        fscanf(fp,"%s %s %i %f %f",newptr->pfn,newptr->pln,&newptr->pid,&newptr->pwt,&newptr->phgnum);
        printf("First Name: %s\n",newptr->pfn);
        printf("Last Name: %s\n",newptr->pln);
        printf("PID: %i\n",newptr->pid);
        printf("Weight: %f\n",newptr->pwt);
        printf("HG1AC: %f\n",newptr->phgnum);

        if( 5 != fscanf(fp,"%s %s %i %f %f",newptr->pfn,newptr->pln,&newptr->pid,&newptr->pwt,&newptr->phgnum)) {
             break;
        }           
}

【问题讨论】:

  • 请显示newptr的定义
  • 在您的输入文件中,数据Sophia Jackson 1234 141.0 1.1 Emma Aiden 5432 142.0 1.2 是否真正用空白行分隔?
  • 他们不是在尝试使用文件中的患者数据创建链接列表。所以希望是使用 fscanf 读取该行,将其插入到字段中,将患者插入到链表中,并使用某种终止语句,当它到达 EOF 时将结束循环。我两个scanf就足够了,但每次都跳过一行,基本上擦除了我一半的数据。有没有更好的方法来做到这一点?

标签: c file scanf


【解决方案1】:

您对fscanf() 的第二次调用将读取第二行数据,并用第一个fscanf() 覆盖之前从第一行读取的数据。

您的循环中只需要一个fscanf()

另外,您如何在循环中设置/更改newptr

附录(2018 年 5 月 9 日)

您应该在循环中只使用一个fscanf() 调用。此外,您应该在循环顶部检查该调用的结果,以确定您何时遇到 EOF,以及何时终止循环。

您也可以在阅读下一行之前致电feof() 检查EOF。

【讨论】:

  • 我正在创建一个患者的链接列表,我已经弄清楚了。我只是想知道如何从文件中读取。我正在使用第二个 scaf,所以我知道 EOF 是什么时候,有没有更好的方法来做到这一点?
  • 我添加了一个附录来回答你的问题。
【解决方案2】:

while 循环中有 2 个 fscanf 函数调用。您认为第一个用于显示,而第二个调用的结果只是被忽略了。这意味着您忽略了所有数据中的一半。

以下将解决问题。

while(1){

        if( 5 != fscanf(fp,"%s %s %i %f %f",newptr->pfn,newptr->pln,&newptr->pid,&newptr->pwt,&newptr->phgnum)){
             break;
        }           

        printf("First Name: %s\n",newptr->pfn);
        printf("Last Name: %s\n",newptr->pln);
        printf("PID: %i\n",newptr->pid);
        printf("Weight: %f\n",newptr->pwt);
        printf("HG1AC: %f\n",newptr->phgnum);
}

【讨论】:

  • 我正在尝试从行中获取数据,将其插入到链表中,然后重新编写 newptr。所以我需要初始 fscanf 来读取数据,当我到达不需要 fscanf 的 EOF 时,有没有办法终止循环?
猜你喜欢
  • 1970-01-01
  • 2012-10-09
  • 2017-10-05
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多