打印txt文件的校验和而不打印文件路径

时间:2015-06-19 07:50:12

标签: c linux string parsing tokenize

我想用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

如何摆脱此路径并仅访问校验和值?

2 个答案:

答案 0 :(得分:2)

shasum的输出格式为

 <HASH> <Filename>

因此,哈希值和文件名用空格分隔。将哈希与完整输出分开的一种可能方法是在打印之前标记化 buff

您可以使用strtok()并使用空格()作为分隔符,仅取出校验和值。

也就是说,在C中,您不会包含#include <iostream>,请勿使用using namespace std;而不要撰写cout。此外,使用C编译器编译C代码。

答案 1 :(得分:1)

三种解决方案:

  1. 由于您使用的是shell,shasum ritesh_file_test.txt | awk '{ print $1; }'可能会有效。

  2. 由于您使用的是C ++:

    std::string checksum(buff);
    checksum = checksum.substr(0, checksum.find(' ') -1 );
    
  3. 甚至,因为哈希总是40个字节:

    std::string checksum(buff, 40);
    
  4. 我将错误检查留作练习!