【发布时间】:2012-03-29 17:55:35
【问题描述】:
我正在处理从文本文件中读取数据并将该数据解析为各种数组的任务。例如,我的文本文件的一部分如下所示:
arbrick pts/26 141.219.210.189 Thu Mar 29 11:23 - 11:24 (00:00)
rjmcnama pts/27 141.219.205.107 Thu Mar 29 11:02 still logged in
ajhoekst pts/26 99.156.215.40 Thu Mar 29 10:59 - 11:08 (00:08)
eacarter pts/31 141.219.162.145 Thu Mar 29 10:50 - 10:51 (00:00)
kmcolema pts/31 141.219.214.128 Thu Mar 29 09:44 - 09:47 (00:03)
我需要将数据解析为以下数组:用户 ID、终端、IP 地址和事件时间。考虑到列之间的空白数量不一致,我该怎么做?
编辑: 我尝试使用 Thiruvalluvar 提供的建议,但我无法让它发挥作用。但是,我确实切换到了 sscanf,并且效果很好几乎...
while(!feof(myfile)) {
fgets(buffer, 256, myfile);
sscanf(buffer, "%s %s %s %s", user_id[i], terminal_id[i], ip_addr[i], events[i]);
} /*End while not EOF*/
有效的是 user_id、terminal_id 和 ip_addr 数组。但是,events 数组目前还不能完美运行。由于 events 数组是一个包含空格的字符串,我如何使用 sscanf 将 buffer 的剩余部分添加到 events 数组中?
【问题讨论】:
-
令我惊讶的是,所有解决方案似乎都在使用字符串函数来搜索流。虽然这可行,但根据经验,最快的解析器使用
fgetc一次迭代一个字符。虽然一开始这似乎违反直觉,但您必须记住,libc 仍会读取页面大小的块,并且您的代码最终会在 cpu 上运行得非常快(执行大腿循环而不是执行函数调用、mallocs、memmoves 等) .我仍然对这些好处感到好奇,因为为此您最终仍将所有内容分配给 C 数组,所以也许我会通过时间比较来尝试一下。