【问题标题】:printing the checksum of a txt file without printing the file path打印txt文件的校验和而不打印文件路径
【发布时间】:2015-06-19 07:50:12
【问题描述】:

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

如何摆脱这条路径,只访问校验和值?

【问题讨论】:

  • 注意不要混用coutprintf;请坚持其中一个。

标签: c linux string parsing tokenize


【解决方案1】:

shasum的输出格式为

 <HASH> <Filename>

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

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

也就是说,在C 中,不要包含#include &lt;iostream&gt;,不要使用using namespace std;,也不要写cout。此外,使用C 编译器编译C 代码。

【讨论】:

    【解决方案2】:

    三种解决方案:

    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);
      

    我将错误检查作为练习留给你!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2014-10-25
      • 1970-01-01
      • 2022-11-28
      • 1970-01-01
      相关资源
      最近更新 更多