【发布时间】:2016-04-11 19:42:44
【问题描述】:
说这是我要阅读的文件:
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", ×tamp, 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", ×tamp, 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", ×tamp, transaction_type_str, company1, &value)) {
node_t *transaction = create_node((long int)timestamp, 1, company1, NULL, value);
add_node(transactions, transaction);
}
然而,这给了我一个无限循环。我是 C 文件 I/O 的新手,我想知道使用标记化方法还是基于行的格式搜索方法更好。
【问题讨论】:
-
fscanf()的问题在于它具有破坏性。您几乎肯定需要使用fgets()或getline()来读取一行,然后使用sscanf()进行分析。这允许您在第一次分析失败时重试。 -
我使用的是 ANSI C,所以我认为
fgets()是我唯一的选择? -
这取决于您所说的“ANSI C”是什么意思。如果你坚持使用 C89/C90,那么我为你感到抱歉——你应该能够使用 C11 或 C99。这还取决于这是否意味着“仅由标准(相关版本)定义的功能”或其他内容。但是,作为起点,
fgets()是最可靠的可用工具。用它来读一行:char buffer[4096]; while (fgets(buffer, sizeof(buffer), fd) != 0) { …analyze buffer with sscanf() etc… }(不是不使用feof())。 -
我正在尝试对
sscanf()做同样的事情。我使用了fgets()并且工作正常,但是我的sscanf()逻辑有问题,我无法弄清楚。