我被要求为文件传输创建校验和算法,我给出的C ++代码如下:
// ChecksumTestTool.cpp : Defines the entry point for the console
application.
//
#include "stdafx.h"
#include <string>
#include <stdio.h>
#include <iostream>
unsigned long CalculateChecksum(FILE* pFile);
int main(int argc, char *argv[])
{
int result = 0;
//Get filename from command args
std::string fileName;
if (argc >= 1)
{
fileName = argv[0];
//Open file with read access
FILE* pFile = nullptr;
int error = fopen_s(&pFile, fileName.c_str(), "r");
if (error != 0 || pFile == nullptr)
{
printf("Failed to open file with error %d\r\n", error);
result = -1;
}
else
{
//Calculate the checksum
unsigned long checksum = CalculateChecksum(pFile);
printf("Calculated Checksum for %s is %lu (0x%04X)\r\n",
fileName.c_str(), checksum, checksum);
}
}
else
{
printf("Must enter filename on command line\r\n");
result = -1;
}
//Wait here so we can see result
printf("\r\nPress Any Key to Exit\r\n");
getchar();
return 0;
}
unsigned long CalculateChecksum(FILE* pFile)
{
unsigned long checksum = 0;
//TODO:: Calculate the checksum
return checksum;
}
我需要在'// TODO ::计算校验和'点创建校验和。该算法需要检查文件是否传输。 到目前为止,我已经尝试过:
unsigned long CalculateChecksum(FILE* pFile)
{
unsigned long checksum = 0;
//TODO:: Calculate the checksum
unsigned long word = 0;
while (file.read(reinterpret_cast<char*>(&word), sizeof(word))); {
checksum += word;
}
if (file.gcount()); {
word &= (~0U >> ((sizeof(unsigned long) - file.gcount()) * 8));
checksum += word;
}
return checksum;
}
我得到的错误是'file'是一个未声明的标识符,而'.gcount'必须有class / struct / union
我搜索过多个校验和,这个算法是我发现的唯一可以在此代码中运行的算法
答案 0 :(得分:1)
有些事情:
您将一个名为pFile
的变量传递给函数,在您使用的函数file
中。
您使用if(expression);
,因此if后面的部分将始终执行,因为if()没有任何影响。
我甚至没有考虑校验和功能是否有效,但是当你做
时if(term);
{
// Do something
}
总会达到一些事情。它应该是
if (term)
{
// Do something
}
所以只有在术语评估为真时才会这样做