我想从一个校验和文件中提取文件名及其相应的MD5总和,格式如下 -
MD5(FreeBSD-8.2-RELEASE-amd64-bootonly.iso)= 2587cb3d466ed19a7dc77624540b0f72
我更喜欢在程序中本地执行此操作,这会排除awk等。
答案 0 :(得分:0)
您应该可以使用fopen()
,fgets()
和strchr()
来实现这一点 - 但首先您需要更准确地确定文件的格式(例如:会发生什么如果文件名包含)
个字符?)
答案 1 :(得分:0)
我不会在大多数语言中提倡它,但为什么不用POSIX regex来提及它呢?
答案 2 :(得分:0)
您可以使用fgets()
轻松阅读线条。甚至不要考虑使用gets()
。
如果你有理由相信你不会处理包含空格或括号的文件名,你可以使用sscanf()
来提取点点滴滴:
char hash_type[16];
char file_name[1024];
char hash_value[128];
if (sscanf(line, "%15s (%1023s) = %127s", hash_type, file_name, hash_value) == 3)
...good to go...
else
...something went wrong...
注意sscanf()
字符串中指定的大小与变量定义的比较;除了使用snprintf()
创建格式字符串之外,没有一种简单的方法可以概括:
char format[32];
snprintf(format, sizeof(format), "%%1%zus )%%%zus) = %%%zus",
sizeof(hash_type)-1, sizeof(file_name)-1, sizeof(hash_value)-1);
你的替代方案是一些常规的正向解析,以便在文件名开始之前找到哈希类型和开括号,以及一些棘手的向后解析,跳过哈希值并找到等于和最后一个右括号,然后收集各个部分。