2012-09-01 6 views
1

제목과 마찬가지로 fopen을 사용하여 파일의 특정 섹션에 데이터를 쓰는 동시에 기존 데이터를 지우지 않고 푸시합니다. 나는 SEEK_SET과 SEEK_CUR과 함께 fseek를 사용했다. 그리고 지금까지 나는 새로운 데이터를 파일의 올바른 부분에 기록 할 수 있었지만, 기존 데이터의 처음 몇 줄은 지워졌다.fopen을 사용하여 파일의 특정 섹션에 데이터를 쓰고 기존 데이터를 삭제하지 않고 파일 아래로 밀어 넣는 방법?

+1

데이터베이스 파일을 사용하는 것처럼 들립니다. 그 목적을 위해 파일을 사용하지 마십시오. –

답변

3

일반적인 데스크탑 및 서버 운영 체제에서 찾은 파일 시스템은 삽입을 지원하지 않으므로 수행 할 수 없습니다.

파일을 다시 작성해야합니다.

3

나는 데이터의 "복잡한"조작과 파일 중간에 물건을 추가하는 데 드물게 fopen을 사용한다는 것은 내가 자주하는 일이 아니라는 것을 인정해야한다. 일반적으로 사용 패턴이 필요할 때 전체 파일을 새 데이터로 덮어 씁니다. 따라서 파일 중간에 데이터를 추가하는 영리한 방법이있을 수 있지만 필자는이를 잘 모릅니다. 사용자가 재정의 할 수 있다고 확신합니다.

파일 중간에 추가 할 수있는 가장 간단한 방법은 다음과 같습니다. 작성해야 할 위치를 찾고 재배치해야 할 바이트 수를 찾고 삽입 할 데이터의 길이를 찾은 다음 이동하십시오 쓰기 커서를 (+ 길이를 쓸 필요가있는 위치에) 옮기고, 그 위치에서부터 재배치해야 할 데이터로 덮어 쓴 다음, 처음에 쓸 필요가있는 것을 씁니다.

#include <stdio.h> 
#include <stdlib.h> 

size_t finsert(void* data, size_t length, FILE* fp) 
{ 
    const long writePosition = ftell(fp); 
    fseek(fp, 0, SEEK_END); 
    const long fileSize = ftell(fp); 
    const long relocatedDataSize = fileSize - writePosition; 
    char* dataToRelocate = malloc(relocatedDataSize); 

    fseek(fp, writePosition, SEEK_SET); 
    fread(dataToRelocate, relocatedDataSize, 1, fp); 

    fseek(fp, writePosition + length, SEEK_SET); 
    fwrite(dataToRelocate, relocatedDataSize, 1, fp); 

    free(dataToRelocate); 

    fseek(fp, writePosition, SEEK_SET); 
    return fwrite(data, length, 1, fp); 
} 

파일에 대한 읽기 및 쓰기 액세스 권한이 필요합니다. 쓰기 만하면 파일이 삭제되지 않습니다.

또한 Cole Johnson이 언급했듯이 "데이터베이스와 같은"파일을 사용하는 경우 SQLite 사용을 고려하십시오. 그것은 당신에게 모든 종류의 미친 물건들을 다루고 많은 일들을 훨씬 더 단순하게 만듭니다.

+0

어쩌면 내가 잘못된 방향으로 가고 있을지도 모릅니다. 어떻게해야합니까? 파일의 임시 복사본을 만들어 다른 이름으로 바꾸고, 원본을 삭제하고, 원본과 같은 이름의 새 파일을 열고, 위쪽에 새 데이터를 붙여 넣은 다음 붙여 넣으십시오 이름이 바뀐 파일에 임시로 복사 된 데이터? – Garry

+0

@Garry, 원하는 것은 파일의 처음 부분에 데이터를 쓰는 것입니다. – zneak

+0

이 맞습니다. 필자는 파일의 시작 부분에 데이터를 쓰고 일부만 덮어 쓰지 않고 기존 데이터를 아래로 밀어 내고 싶습니다. – Garry