校验和,数据完整性

时间:2015-11-19 02:50:24

标签: c++ arrays data-integrity

此任务的伪代码是essentually: 1.以二进制模式打开指定的文件 2.将文件名保存在fileNames数组中。 3.使用seekg和tellg确定文件大小 4.在一个语句中将文件内容读入字符数组 5.关闭文件 6.循环遍历数组,一次一个字符并累加每个字节的总和 7.将总和存储到checkSums数组中。

#include <iostream>
#include <string>
#include <iomanip>
 #include <fstream>
#include <cstring>

using namespace std;


int main()
{
//declare variables
string filePath;
void savefile();
char choice;
int i, a, b, sum;
sum = 0;
a = 0;
b = 0;
ifstream inFile;
//arrays
const int SUM_ARR_SZ = 100;
string fileNames[SUM_ARR_SZ];
unsigned int checkSums[SUM_ARR_SZ];
do {
    cout << "Please select: " << endl;
    cout << "   A) Compute checksum of specified file" << endl;
    cout << "   B) Verify integrity of specified file" << endl;
    cout << "   Q) Quit" << endl;
    cin >> choice;

    if (choice == 'a' || choice == 'A')
    {
        //open file in binary mode
        cout << "Specify the file path: " << endl;
        cin >> filePath;
        inFile.open(filePath.c_str(), ios::binary);

        //save file name
        fileNames[a] = filePath;
        a++;


        //use seekg and tellg to determine file size
        char Arr[100000];
        inFile.seekg(0, ios_base::end);
        int fileLen = inFile.tellg();
        inFile.seekg(0, ios_base::beg);
        inFile.read(Arr, fileLen);
        inFile.close();
        for (i = 0; i < 100000; i++)
        {
            sum += Arr[i];
        }
        //store the sum into checkSums array
        checkSums[b] = sum;
        b++;
        cout << "    File checksum = " << sum << endl;

    }
    if (choice == 'b' || choice == 'B')
    {
        cout << "Specify the file path: " << endl;
        cin >> filePath;
        if (strcmp(filePath.c_str(), fileNames[a].c_str()) == 0)
        {

        }
    }
} while (choice != 'q' && choice != 'Q');
system("pause");
}

我得到像&#34; -540000&#34;而且我不确定如何解决这个问题。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

  1. 您正在堆栈上创建一个数组而不将其内容归零,因此Arr将包含“垃圾”数据。
  2. 您正在创建具有固定大小的缓冲区,这意味着如果文件小于100,000字节并且您无法处理大于100,000字节的文件(不重用缓冲区),则会浪费空间
  3. 迭代缓冲区中的每个字节,而不是代表文件的字节,如果它小于100,000字节。
  4. 我还注意到你正在混合C和C ++字符串函数。如果您使用strcmp,则无需拨打C string,然后使用string::compare
  5. C ++不需要对局部变量进行前向声明,如果你在使用局部变量时只声明局部变量,那么你的代码会更清晰。而不是一次性。