C ++校验和读取不存在的换行符

时间:2011-08-01 03:09:31

标签: c++ checksum

我正在对文件执行非常基本的校验和,方法是将输入文件读入字符数组,然后迭代该数组并将每个字符添加到校验和中。问题是,当我这样做时,我的所有校验和都太高了(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 个答案:

答案 0 :(得分:1)

你的问题在这里:

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

答案 1 :(得分:1)

马丁也是对的 - 你应该在所有情况下都是(num&lt; fileLength)。

另一种可能性是您在编辑器中创建了文件,并且人为地添加了虚假的换行符。这很常见。尝试在十六进制编辑器中转储文件。我只是运行你的程序(&lt; =删除),它工作正常。