gpt4 book ai didi

c - 将逗号分隔的文本文件读入结构 C

转载 作者:行者123 更新时间:2023-12-02 16:17:25 25 4
gpt4 key购买 nike

我有一个以逗号分隔的船及其规范列表,我需要将其读入结构。每行包含不同的船及其规范,因此我必须逐行阅读文件。

示例输入文件(我将使用的文件超过 20 行):

pontoon,Crest,Carribean RS 230 SLC,1,Suzuki,115,Blue,26,134595.00,135945.00,1,200,0,250,450,450,0
fishing,Key West,239 FS,1,Mercury,250,Orange,24,86430.00,87630.00,0,0,250,200,500,250,0
sport boat,Tahoe,T16,1,Yamaha,300,Yellow,22,26895.00,27745.00,0,250,0,0,350,250,0

我有一个链表 watercraft_t:

typedef struct watercraft {
char type[15]; // e.g. pontoon, sport boat, sailboat, fishing,
// canoe, kayak, jetski, etc.
char make[20];
char model[30];
int propulsion; // 0 = none; 1 = outBoard; 2 = inBoard;
char engine[15]; // Suzuki, Yamaha, etc.
int hp; // horse power
char color[25];
int length; // feet
double base_price;
double total_price;
accessories_t extras;
struct watercraft *next;
} watercraft_t;

我的主要功能打开文件并将其存储在指针中:

FILE * fp = fopen(argv[1], "r"); // Opens file got from command line arg

然后将此文件传递给一个函数,该函数应准确解析 1 行,然后返回该节点以放置在链表中。

 // Create watercrafts from the info in file
watercraft_t *new_waterCraft( FILE *inFile )
{
watercraft_t *newNode;

newNode = (watercraft_t*)malloc(sizeof(watercraft_t));

fscanf(inFile, "%s %s %s %d %s %d %s %d %lf %lf", newNode->type, newNode->make, newNode->model, &(newNode->propulsion), newNode->engine, &(newNode->hp), newNode->color, &(newNode->length), &(newNode->base_price), &(newNode->total_price));

return newNode;
}

当调用函数仅打印每艘船的类型时,结果如下:

1. pontoon,Crest,CRS
2. SLC,1,Suzuki,11fishing,Key
3. SLC,1,Suzuki,11fishing,Key
4. SLC,1,Suzuki,11fishing,Key
5. SLC,1,Suzuki,11fishing,Key
6. SLC,1,Suzuki,11fishing,Key
7. SLC,1,Suzuki,11fishing,Key
8. SLC,1,Suzuki,11fishing,Key
9. SLC,1,Suzuki,11fishing,Key
10. SLC,1,Suzuki,11fishing,Key
11. SLC,1,Suzuki,11fishing,Key
12. SLC,1,Suzuki,11fishing,Key
13. SLC,1,Suzuki,11fishing,Key
14. SLC,1,Suzuki,11fishing,Key
15. SLC,1,Suzuki,11fishing,Key
16. SLC,1,Suzuki,11fishing,Key
17. SLC,1,Suzuki,11fishing,Key

我已将问题缩小到如何使用 fscanf 从文件中读取值。

我尝试的第一件事是在我所有的占位符之间使用 %*c 但在运行之后,我的输出看起来完全一样。接下来我意识到我将无法使用 fscanf,因为文本文件将包含需要读取的空白。

我的下一个想法是使用 fgets,但我认为我也无法使用它,因为我不确定每次需要读取多少字符。我只需要它在行尾停止阅读,同时用逗号分隔值。

我已经搜索了几个小时的答案,但到目前为止似乎没有任何效果。

最佳答案

当您使用 %s 时,文本将被解析直到找到空格或换行符,例如,对于文件的第一行,fscanf 将将 "pontoon,Crest,Carribean" 存储在 make 中,当找到空格时解析停止。

fscanf 说明符必须匹配文件中的行,包括逗号,因此您需要这样的东西:

" %14[^,], %19[^,], %29[^,], %d , %14[^,], %d , %24[^,], %d , %lf , %lf /*...*/"

(注意格式说明符开头的空格,这样可以避免解析之前读取的剩余空白)

格式说明符 [^,] 使 fscanf 读取直到找到逗号或达到限制大小,它还会解析空格而不是 %s,此外,使用 %14[^,] 避免了缓冲区溢出导致的潜在未定义行为,因为它将读取限制为 14 个字符加上空终止符匹配缓冲区的大小为 15

使用fgets 来解析行似乎是个好主意,然后您可以使用sscanf 来转换值,它的工作方式类似于fscanf.

我建议您验证 *scanf 的返回,以确保读取了正确数量的字段。

关于c - 将逗号分隔的文本文件读入结构 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66312981/

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