2011-08-01 2 views
0

입력 파일을 문자 배열로 읽어 들이고 그 배열을 반복하고 각 문자를 체크섬에 추가하여 파일에 매우 기본적인 체크섬을 수행하고 있습니다. 문제는 내가 이것을 할 때 체크섬 모두가 10 개가 너무 높다는 것입니다 (10은 개행 문자에 대한 ascii 십진수 값입니다).C++ 체크섬 존재하지 않는 개행 읽기

내 텍스트에 개행 문자가 없다는 것을 알고있는 경우 개행 문자가 내 코드에 어떻게 삽입됩니까? 한줄짜리 텍스트 파일조차도 개행 문자가 추가됩니다!

num <= fileLength 

그것은해야한다 :

#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 

. 길이가 1 인 경우 유효한 문자는 charArray[0]

입니다. 이렇게 :

inputFile.read(charArray, fileLength); 

하면 fileLength 배열의 크기보다 클 수 있으므로 dangerious이다.
더 나은 솔루션 (동적으로 크기로)

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을 표시하고 있습니다. for 루프를'num Moses

+0

@Martin : 또한 전체 파일을 메모리로 읽지 않아야합니다. 10G 데이터 파일을 열면 어떻게됩니까? 작은 블록으로 파일을 읽으십시오. –

+0

@Moses : 파일 길이가 3이라고 말하면 파일에 3 자입니다. (0, 1, 2) 유효성을 검사 할 다른 도구로 파일을 체크 아웃하지만 파일에 세 개의 문자가 있습니다. –

1

마틴도 정확합니다. 모든 경우에 (numfileLength)이어야합니다.

다른 가능성은 편집자로 파일을 만든 것이고 인위적으로 가짜 줄 바꿈이 추가 된 것입니다. 그것은 흔한 일입니다. 16 진수 편집기에서 파일을 덤프 해보십시오. 방금 (< = 제거 된) 프로그램을 실행하고 잘 작동합니다.

관련 문제