我认为使用fgets
逐行读取每个文件,然后使用strtok
将每行按照分隔符字符串"*|"
进行拆分,会更加容易阅读。
接着,我使用strdup
将文本字符串复制到结构体中,并使用sscanf
从第三个标记中提取车费。需要注意的是,strdup
调用了内部的malloc
函数,应当对其返回值进行测试。
除非有限制条件,否则我都使用double
而不是float
。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
typedef struct {
char *city;
char *descrip;
double fare;
} flight_t;
int main()
{
FILE *fp;
flight_t visit[MAX] = {0};
char buffer [1024];
char *tok;
int records = 0, i;
if((fp = fopen("Ponuda.txt", "rt")) == NULL) {
printf("Error opening file\n");
exit(1);
}
while(fgets(buffer, sizeof buffer, fp) != NULL) {
if((tok = strtok(buffer, "|*")) == NULL) {
break;
}
if(records >= MAX) {
printf("Too many records\n");
exit(1);
}
visit[records].city = strdup(tok);
if((tok = strtok(NULL, "|*")) == NULL) {
break;
}
visit[records].descrip = strdup(tok);
if((tok = strtok(NULL, "|*")) == NULL) {
break;
}
if(sscanf(tok, "%lf", &visit[records].fare) != 1) {
break;
}
records++;
}
fclose(fp);
for(i = 0; i < records; i++) {
printf("** %s ** %s |%.2f|\n", visit[i].city, visit[i].descrip, visit[i].fare);
}
for(i = 0; i < records; i++) {
free(visit[i].city);
free(visit[i].descrip);
}
return 0;
}
程序输出:
** Paris ** Flight,5 days,visiting various monuments. |2999.990000|
** Amsterdam ** By bus,7 days, local art gallery. |999.990000|
** London ** Flight,3 days,lots of free time. |1499.990000|
%s
只能读取一个单词。你不能用它来读取整个描述。 - Barmarfgets
和strtok
函数来将每一行以分隔符字符串"*|"
进行分割。然后使用strdup
函数复制这两个文本字符串,并使用sscanf
函数从第三个标记中提取费用。 - Weather Vanescanf
系列函数中的函数,读取字符串直到遇到空格(空格、制表符、换行符)。 - Aleksandar Makragić