gpt4 book ai didi

c - 如何使用fscanf()获取多种格式的字符串?

转载 作者:行者123 更新时间:2023-11-30 15:09:38 25 4
gpt4 key购买 nike

说这是我要读取的文件:

07983988 REMOVE String1
13333337 ADD String4 100
34398111 TRANSFER String5 String6 100

这些是仅有的 3 种有效格式类型。

我使用以下代码块来检查解析的行的格式:

// Read from file.
while (!feof(fd)) {

// Check for format.
if (fscanf(fd, "%d %s %s %s %lf", &timestamp, transaction_type_str, company1, company2, &value)) {
node_t *transaction = create_node((long int)timestamp, 1, company1, company2, value);
add_node(transactions, transaction);
} else if (fscanf(fd, "%d %s %s", &timestamp, transaction_type_str, company1)) {
node_t *transaction = create_node((long int)timestamp, 1, company1, NULL, 0);
add_node(transactions, transaction);
} else if (fscanf(fd, "%d %s %s %lf", &timestamp, transaction_type_str, company1, &value)) {
node_t *transaction = create_node((long int)timestamp, 1, company1, NULL, value);
add_node(transactions, transaction);
}

然而,这给了我一个无限循环。我是 C 语言文件 I/O 的新手,我想知道使用标记化方法或基于行的格式搜索方法是否更好。

最佳答案

概述:

char buffer[4096];

while (fgets(buffer, sizeof(buffer), fd) != 0)
{
int offset;
if (sscanf(buffer, "%d %s %n", &timestamp, transaction_type_str, &offset) == 2)
{
char *residue = buffer + offset;
if (strcmp(transaction_type_str, "REMOVE") == 0)
{
if (sscanf(residue, "%s", company1) == 1)
…process remove…
else
…report error, etc…
}
else if (strcmp(transaction_type_str, "ADD") == 0)
{
if (sscanf(residue, "%s %lf", company1, &value) == 2)
…process add…
else
…report error, etc…
}
else if (strcmp(transaction_type_str, "TRANSFER") == 0)
{
if (sscanf(residue, "%s %s %lf", company1, company2, &value) == 3)
…process transfer…
else
…report error, etc…
}
else
{
…report error and continue or break…
}
}
}

您可以使分析更加严格,例如,坚持在辅助 sscanf() 调用完成后不存在未使用的数据,等等。虽然这很繁琐,但也并非不可能。

这涵盖了请求的代码 - 它在分析该行的其余部分之前识别请求的事务类型。

关于c - 如何使用fscanf()获取多种格式的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36557824/

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