2011-08-01 8 views
0

入力ファイルを文字配列に読み込んだ後、その配列を繰り返して各文字をチェックサムに追加することで、ファイルに対して非常に基本的なチェックサムを行います。問題は、私がこれを行うと、チェックサムのすべてが10になりすぎることです(10は改行文字のアスキー10進数値です)。C++チェックサム読み込みの存在しない改行

テキストに改行文字がないことを知っているときに、改行文字をコードに挿入する方法を教えてください。単一行のテキストファイルでも改行文字が追加されます!

#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; 
} 

答えて

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

ああ、ここには事があります:私はちょうど2文字のファイルに3の長さを表示しています。 forループを 'num Moses

+0

@Martin:ファイル全体を決してメモリに読み込まないでください。 10Gデータファイルを開いた場合はどうなりますか?小さなブロックでファイルを読んでください。 –

+0

@Moses:ファイルの長さが3であるとすると、ファイルには3文字があります。 (0、1、2)検証するために別のツールでファイルをチェックアウトしますが、ファイルには3つの文字があります。 –

1

Martinも正しくありました。すべてのケースで(numfileLength)にする必要があります。

他の可能性は、あなたのファイルをエディタで作成したもので、人為的に偽の改行が追加されている可能性があります。それは普通です。ファイルを16進エディタでダンプしてみてください。私はちょうど(< =削除された)あなたのプログラムを実行し、それは正常に動作します。

関連する問題