C ++ контрольная сумма чтения несуществующей новой строки - PullRequest
0 голосов
/ 01 августа 2011

Я делаю очень простую контрольную сумму для файлов, читая входной файл в массив символов, а затем перебирая этот массив и добавляя каждый символ в контрольную сумму.Проблема в том, что когда я делаю это, все мои контрольные суммы слишком высоки (10 - десятичное значение ascii для символа новой строки).

Как это происходит, символы новой строки вставляются в мой код, когда я знаюна самом деле в моем тексте нет символа новой строки?Даже однострочный текстовый файл добавляет символ новой строки в!

#include <iostream>
#include <fstream>

int main () {
    int fileLength = 0;
    std::ifstream inputFile;
    char charArray[10000];
    int checkSumValue = 0;

    // open file in binary
    inputFile.open("/Path/To/File", std::ios::binary);

    // get file length, then return to beginning of file
    inputFile.seekg(0, std::ios_base::end);
    fileLength = inputFile.tellg();
    inputFile.seekg(0, std::ios_base::beg);

    // read all data from file into char array
    inputFile.read(charArray, fileLength);

    // iterate over char array, adding ascii decimal value to checksum
    for (int num = 0; num <= fileLength; num++) {
        std::cout << "Checksum value before iteration " << num << " is " 
        << checkSumValue << std::endl;
        checkSumValue += static_cast<int>(charArray[num]);
    }

    // properly close out the input file
    inputFile.close();
    inputFile.clear(std::ios_base::goodbit);  

    std::cout << "The checksum value is: " << checkSumValue << std::endl;
    std::cout << "The file length is: " << fileLength << std::endl;

    return 0;
}

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Мартин тоже был прав - вы должны быть (num

Другая возможность состоит в том, что вы создали свой файл в редакторе, и он искусственно добавил для вас ложную новую строку.Это обычное дело.Попробуйте сбросить файл в шестнадцатеричном редакторе.Я только что запустил вашу программу (с удаленным <=), и она отлично работает. </p>

1 голос
/ 01 августа 2011

Ваша проблема здесь:

num <= fileLength

Это должно быть:

num < fileLength

Например.Если длина равна 1. Тогда единственным допустимым символом является charArray[0]

Также обратите внимание.Делать это:

inputFile.read(charArray, fileLength);

опасно, поскольку fileLength может быть больше, чем размер массива.
Лучшим решением было бы использование вектора (так как он динамически изменяет размеры)

std::vector<char>   charArray(fileLength);
inputFile.read(&charArray[0], fileLength);

Но вам действительно нужно копировать данные в массив?Почему бы просто не сделать сумму на лету.

size_t checkSumValue = std::accumulate(std::istreambuf_iterator<char>(fileLength),
                                       std::istreambuf_iterator<char>(),
                                       size_t(0)
                                      );
...