Контрольные суммы, целостность данных

псевдокод для этого назначения по существу:
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");
}

Я получаю значения типа «-540000», и я не уверен, как это исправить. Любая помощь очень ценится!

-1

Решение

  1. Вы создаете массив в стеке, не обнуляя его содержимое, поэтому Arr будет содержать «мусорные» данные.
  2. Вы создаете буфер с фиксированным размером, что означает, что вы тратите впустую пространство, если файл меньше 100 000 байт и вы не можете обработать файл, размер которого превышает 100 000 байт (без повторного использования буфера)
  3. Вы перебираете каждый байт в буфере вместо тех байтов, которые представляют файл, если он меньше 100 000 байтов.
  4. Я также отмечаю, что вы смешиваете строковые функции C и C ++. Вам не нужно звонить С strcmp если вы используете string затем используйте string::compare,
  5. C ++ не требует предварительного объявления локальных переменных, ваш код будет чище, если вы объявите только локальные переменные, когда они используются, а не все сразу.
0

Другие решения

Других решений пока нет …