gpt4 book ai didi

c - 在 while 循环中从 c 中的文件读取

转载 作者:行者123 更新时间:2023-11-30 18:34:48 25 4
gpt4 key购买 nike

我正在尝试从文件中读取患者信息,将文件中的数据插入到结构的字段中,并将节点插入到链接列表中,直到到达 EOF。我遇到的问题是当我到达 EOF 时试图终止我的 while 循环。我使用 fscanf 读取文件的每一行,并使用另一个 fscanf 检查文件末尾。放置 2 个 fscanf 每次都会产生一个新行并跳过一半的数据。在 while 循环中检查 EOF 的更好方法是什么?我的文本文档中的信息就是这样格式化的。但它们不是每个患者之间的换行符。我只是为了可读性才在这篇文章上这样做的。

索菲亚· jackson 1234 141.0 1.1

艾玛·艾登 5432 142.0 1.2

奥利维亚·卢卡斯 5685 143.0 1.3

艾娃利亚姆 5672 144.0 1.4

米娅·诺亚 3467 145.0 1.5

伊莎贝拉·伊森 8654 146.0 1.6

莱利·梅森 2567 147.0 1.7

阿里亚卡登 6794 148.0 1.8

佐伊·奥利弗 3467 149.0 1.9

fp = fopen("info.txt","r");

if(fp == NULL){
printf("ERROR File Doesn't exist\n");
}


while(1){

newptr = (node*)malloc(sizeof(node));
newptr->back = NULL;
newptr->next = NULL;
newptr->phgnum = 0;
newptr->pid = 0;
newptr->pwt = 0;
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);

(insert node into linked list)

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

最佳答案

当您读取格式化数据时,您希望根据成功读取一个数据单元(此处为一行)来控制循环。这可确保您仅在验证读取后才尝试处理信息。虽然使用 fgets 然后调用 sscanf 通常是一个更好的主意,但从格式化文件读取时,它最终相当于您的 fscanf > 打电话。唯一的区别是您失去了独立验证读取和解析的能力。 (这是否重要取决于具体情况)

对于您的阅读,您最好在分配节点之前将值读入临时结构中。读取之前不需要进行任何分配,允许您在调用 malloc 之前验证读取。根据您的需要,可以采用不同的方法来执行此操作,但一般方法是:

#include <stdio.h>
#include <stdlib.h>

#define MAXNAME 16 /* size as appropriate - or dynamically allocate */

typedef struct { /* declare struct as required */
char pfn[MAXNAME],
pln[MAXNAME];
float pwt,
phgnum;
int pid;
} node_t;

int main (int argc, char **argv) {

size_t npt = 0; /* number of patients */
node_t tmp = { .pfn = "" }; /* temp struct for read */
/* read from filename given as 1st argument (or stdin by defaut) */
FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin;

if (!fp) { /* validate file open for reading */
fprintf (stderr, "error: file open failed '%s'.\n", argv[1]);
return 1;
}

/* while there is a good read of patient data */
while (fscanf (fp, "%15s %15s %d %f %f", tmp.pfn, tmp.pln, &tmp.pid,
&tmp.pwt, &tmp.phgnum) == 5) {
node_t *newptr = malloc (sizeof *newptr); /* allocate node */

if (!newptr) { /* validate allocation */
perror ("malloc-newptr");
break;
}

*newptr = tmp; /* assign tmp data to node */
/* add to linked list -- here */

printf ("%-16s %-16s %5d %6.2f %6.2f\n", newptr->pfn, newptr->pln,
newptr->pid, newptr->pwt, newptr->phgnum);

npt++; /* increment patient count */
}
if (fp != stdin) fclose (fp); /* close file if not stdin */
/* don't forget to free list */
return 0;
}

(注意:数据只是上面的输出,您只需将其添加到列表中并删除输出(或将其包装在 #ifdef DEBUG ... #endif 中以使其成为条件是否定义了 DEBUG))

输入文件示例

$cat dat/patients.txt
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
Zoe Oliver 3467 149.0 1.9

示例使用/输出

$ ./bin/patient_read <dat/patients.txt
Sophia Jackson 1234 141.00 1.10
Emma Aiden 5432 142.00 1.20
Olivia Lucas 5685 143.00 1.30
Ava Liam 5672 144.00 1.40
Mia Noah 3467 145.00 1.50
Isabella Ethan 8654 146.00 1.60
Riley Mason 2567 147.00 1.70
Aria Caden 6794 148.00 1.80
Zoe Oliver 3467 149.00 1.90

仔细检查一下,如果有任何问题请告诉我。

关于c - 在 while 循环中从 c 中的文件读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50225791/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com