2011-08-01 23 views
0

我正在做一個非常基本的校驗和文件,通過讀取輸入文件到字符數組,然後遍歷該數組並將每個字符添加到校驗和中。問題是,當我這樣做時,我所有的校驗和都是10太高(10是換行符的ASCII十進制值)。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); 

是dangerious作爲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

啊,但這裏是這樣的:我在文件上顯示長度爲3,只有兩個字符:At。即使在將for循環更改爲'num Moses

+0

@Martin:你也不應該把整個文件讀入內存。如果你打開一個10G數據文件會發生什麼?以小塊閱讀文件。 –

+0

@Moses:如果它說文件長度是3,那麼文件中有三個字符。 (0,1,2)用另一個工具檢出文件進行驗證,但文件中有三個字符。 –

1

馬丁也是正確的 - 你應該(NUM <文件長度)在所有情況下。

另一種可能性是,你在編輯器中創建了你的文件,它爲你人爲地添加了一個虛假的換行符。這很常見。嘗試在十六進制編輯器中轉儲文件。我剛剛運行你的程序(< =刪除),它工作正常。