>source

파일의 특정 이진 데이터 (2 바이트)를 읽으려고 하는데이 임무는 잘 작동합니다. 같은 위치에서 다시 (2 바이트)를 다시 쓸 때의 문제입니다. 불행히도 전체 파일 데이터를 0으로 변경합니다.

다음 두 스크린 샷을보십시오 :

쓰기 전 데이터 :

쓰기 후 데이터 :

코드 :

bool myClass::countChanger() {
    std::ifstream sggFileObj_r(this->sggFilePath, std::ios::binary);   
    if (!sggFileObj_r.is_open()) {
        std::cerr << strerror(errno) << std::endl;
        return false;
    }
    // Buffer variable
    unsigned short count;
    // Move the file pointer to offset 4
    sggFileObj_r.seekg(4);
    // Reading data 
    sggFileObj_r.read((char*)&count, sizeof(unsigned short));
    sggFileObj_r.close();
    //// ---------------------- ////
    std::ofstream sggFileObj_w(this->sggFilePath, std::ios::binary | std::ios::app);
    // Increase the buffer variable by one
    count += 1;
    // Move the file pointer again to offset 4
    sggFileObj_w.seekp(4);
    // Rewriting data again to the file after modification
    sggFileObj_w.write((char*)&count, sizeof(unsigned short));
    sggFileObj_w.close();
    return true;
}

이러한 이유와 해결 방법은 무엇입니까?

<시간>

업데이트:

std::ios::app 를 추가했습니다  파일 모드로 전환하고 제로 문제가 해결되었지만 업데이트하려는 특정 데이터가 업데이트되지 않았습니다.

  • 답변 # 1

    사용

    std::ofstream sggFileObj_w(this->sggFilePath, std::ios::binary)
    
    

    이 파일의 데이터를 지울 것입니다.  기본적으로 수행됩니다. 사용할 수 있습니다

    ofstream
    
    

    데이터가 오버라이드되는 것을 막으려면 이것의 문제는 파일의 끝에서 파일 스트림이 시작되고 나머지 파일이 존재하지 않는 것처럼 보이기 때문에 다시 시작하여 덮어 쓸 수 있다는 것입니다 내용.

    대신 할 수있는 것은 std::ofstream sggFileObj_w(this->sggFilePath, std::ios::binary | std::ios::app); 를 사용하는 것입니다  ~처럼

    fstream
    
    

    내용을 잃지 않고 처음부터 바이너리 모드로 파일을 엽니 다. 그런 다음 파일에 쓰려는 위치를 찾을 수 있습니다.

    std::fstream sggFileObj_w(this->sggFilePath, std::ios::binary | std::ios::out | std::ios::in);

  • 이전 hibernate - Spring Boot JPA에서 Lazy Loaded 객체를 JSON으로 변환
  • 다음 cmake - c 컴파일러 고장 - 간단한 테스트 프로그램을 컴파일 할 수 없음