2015-06-19 28 views
-1

我要计算在Mac用C txt文件的校验和,因此,我写了一个简单的程序作为打印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

请注意,您不应该混用'cout'和'printf';请坚持一个或另一个。 –

回答

2

shasum输出格式形式

<HASH> <Filename> 

这样,散列值和文件名由空格隔开。一种可能的方法是将散列与完整的拼布分开,在打印之前将标记为buff

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

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

1

三种解决方案:

  1. 由于您使用的是外壳,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); 
    

我离开错误检查作为一个练习为您服务!