我想用Mac中的C计算txt文件的校验和,因此我写了一个简单的程序
#include <iostream>
#include <stdio.h>
using namespace std;
int main() {
FILE *in;
char buff[512];
if(!(in = popen("shasum ritesh_file_test.txt", "r")))
{
return 1;
}
while(fgets(buff, sizeof(buff), in)!=NULL)
{
cout << buff;
}
printf ("checksum = %s",buff);
pclose(in);
return 0;
它打印txt文件的校验和,但它也打印文件的路径。如
30b574b4ddbc681d9e5e6492ae82b32a7923e02e ritesh_file_test.txt
如何摆脱此路径并仅访问校验和值?
答案 0 :(得分:2)
shasum
的输出格式为
<HASH> <Filename>
因此,哈希值和文件名用空格分隔。将哈希与完整输出分开的一种可能方法是在打印之前标记化 buff
。
您可以使用strtok()
并使用空格()作为分隔符,仅取出校验和值。
也就是说,在C
中,您不会包含#include <iostream>
,请勿使用using namespace std;
而不要撰写cout
。此外,使用C
编译器编译C
代码。
答案 1 :(得分:1)
三种解决方案:
由于您使用的是shell,shasum ritesh_file_test.txt | awk '{ print $1; }'
可能会有效。
由于您使用的是C ++:
std::string checksum(buff);
checksum = checksum.substr(0, checksum.find(' ') -1 );
甚至,因为哈希总是40个字节:
std::string checksum(buff, 40);
我将错误检查留作练习!