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