문제

나는 임무가 주어 왔으로 업데이트하는 기능 연결 구성 파일에서 디스크에서 채우는 구조체:

static int LoadFromFile(FILE *Stream, ConfigStructure *cs)
{
  int tempInt;

   ...

  if ( fscanf( Stream, "Version: %d\n",&tempInt) != 1 )
  {
    printf("Unable to read version number\n");
    return 0;
  }
  cs->Version = tempInt;
   ...

}

하나는 우리가 할 수 있습을 무시 쓰기 구성하여 디스크 및 대신 통과 그것은 바로 메모리에,거의 동일한다.

static int LoadFromString(char *Stream, ConfigStructure *cs)

몇 가지를 참고:

  • 현재 LoadFromFile 기능은 매우 치밀하고 복잡한,수십 읽 버전의 설정파일에서 이전 버전과 호환되는 방식으로,만드는 이중의 전반적인 논리로 아주 고통이다.
  • 는 기능을 생성 설정 파일과는 사람들은 그것을 읽을 시작에서 완전히 다른 부분의 오래된 시스템이므로 공유하지 않는 모든 데이터의 구조는 그래서 전달할 수 없습니다 사람들이 직접 있습니다.나는 잠재적으로 쓰는 래퍼지만,다시,그것은 처리해야 하는 모든 구조에 통과시에서 호환되는 방식이다.
  • 나는 유혹하는 그냥 통과하는 파일에 문자열로(으로 프로토타입에 위)및 변환 모든 fscanf 의 sscanf 의 그러나 나는 손잡이가 증가하는 포인터와 함께(과 잠재적으로 처리 버퍼런 오류)수 있습니다.
  • 이에서 남아 있 C,그래서는 C++같은 기능 스트림이 여기에 도움이 될 수 있습니다

나는 더 나은 옵션입니까?은 거기에 몇 가지 방법으로 파일을 만들려면*실제로 그냥 지점에 위치 대신 메모리 디스크에 있는?어떤 포인터를,제안 또는 기타의 도움은 대단히 감사합니다.

도움이 되었습니까?

해결책

기 때문에 당신은 유지하려는 파일에서 데이터를 메모리를 사용할 수 있어야 합니다 공유 메모리.POSIX 공유 메모리가 실제적으로 변화된 메모리입니다.공유 메모리를 개체 매핑할 수 있는 프로세스 주소 공간으로 사용 mmap() 필요한 경우입니다.공유 메모리는 일반적으로 사용으로 IPC 메커니즘,하지만 당신은 그것을 사용하실 수 있습니다.

다음 예제 코드를 사용 POSIX 공유 메모리(shm_open() & shm_unlink() 에서)와 함께 FILE * 을 쓰기 텍스트를 공유 메모리를 개체 및 다음에 다시 읽.

#include <fcntl.h>
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>

#define MAX_LEN 1024

int main(int argc, char ** argv)
{
    int    fd;
    FILE * fp;
    char * buf[MAX_LEN];

    fd = shm_open("/test", O_CREAT | O_RDWR, 0600);

    ftruncate(fd, MAX_LEN);

    fp = fdopen(fd, "r+");

    fprintf(fp, "Hello_World!\n");

    rewind(fp);

    fscanf(fp, "%s", buf);

    fprintf(stdout, "%s\n", buf);

    fclose(fp);

    shm_unlink("/test");

    return 0;
}

참고:I had to pass -lrt 링커에 컴파일하는 경우 이 예 gcc 리눅스에서.

다른 팁

할 수 없는 경우에는 전달 구조 및 전달해야 합 데이터 문자열로,다음을 할 수 있어야한 조정 기능에서 읽을 대신 문자열이 포함되어 있습니다:는 경우 기능으로 복잡을 설명한 다음,변환 fscanf->sscanf 아마도 가장 간단한 방법으로 이동합니다.

여기에는 아이디어를 사용하여 귀하의 함수 프로토 타입니다.읽기 전체에서 문자열 데이터(처리하지 않고 그것의 어떤)및에서 그것을 저장하는 로컬 버퍼입니다.는 방법으로 코드를 가질 수 있는 임의의 데이터에 액세스할 수으로 파일을 만드는 버퍼를 초과 쉽게 예측하고 피하기 위해.에 의해 시작 mallocing 는 적당한 크기의 버퍼에 데이터를 복사하고 realloc 자신에게 더 많은 공간이 필요합니다.당신은 로컬 사본의 전체 데이터 버퍼를 통해 검사 및추출물이 어떤 데이터가 필요합니다.

이 얻을 수 있습니다 까다로운 경우 '\0' 문자는 유효한 입력.는 경우에,당신은 당신이 추가 논리를 테스트하는 경우 이의 끝 입력 문자열이나 단지로 바이트(난이도에 따라서 특정 형식의 데이터 버퍼).

  • mkstemp() 임시 파일을 만들.그 char * 인자로 사용 템플릿으로 파일의 이름입니다.하지만,그것은 반환하는 파일을 설명한다.

  • tmpfile().그것은 반환 FILE *, 하지만,일부 보안 문제 또한,당신은 당신을 복사할 문자열이다.

  • mmap() ( Beej 가이드 도)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top