2010-01-25 3 views
6

내 프로그램에서 설정 파일의 다양한 텍스트 행을 포함하는 텍스트 파일을 읽는 중입니다. 일부 선은 매우 커질 수 있습니다. 현재 버퍼 크기는 4096 자입니다. 악의적이거나 프로그램 내에서 작동하는 다양한 요인으로 인해 일부 라인이이를 초과 할 수 있습니다.파일에서 이름/값 쌍을 읽을 수있는 광범위한 C 라이브러리가 있습니까?

현재 루틴은 쓰기가 지루하고 지금은 지루한 반복 코드가 더 많이 필요할 수있는 파일의 가능한 내용을 확장하려고합니다. (이는 설정 유형 파일로 name value 쌍과 간혹 섹션 헤더로 구성되며, 여러 개의 정밀도로 인해 일부 숫자 값을 문자열로 읽어야합니다.)

내가 원했던 중요한 점은 버퍼 오버플로없이 임의 길이 선을 읽는 것입니다. 나는 getline이 나를 위해 이것을 할 수 있다는 것을 알았지 만, 하늘을 위해 저를위한 지루한 일을 많이 할 라이브러리가 있습니까?

편집 :

나는 이름과 값 사이의 = 기호를 배치하도록 강요하지 않으려면, 빈 공간이 구분으로 충분합니다.

널리 퍼져 있기 때문에 인기있는 Linux 배포판의 표준 패키지에서 라이브러리를 사용할 수 있어야합니다.

나는 libconfig을 알고 있지만 내 요구 사항이 지나치게 과장된 것 같습니다.

답변

1

내 제안은 DIY입니다. 아주 쉽습니다.

  • 은 버퍼
  • 를 할당과 이름 값 쌍을 읽을

  • 카운트 문자 당신의 분리 때까지 당신의 분리 후 각 라인을 읽고 sscanf를

    같은 :

    sscanf(line, "%[^:]: %[^\n]", key, value);

sccanf 전에 문자를 계산 한 이후로는 안전합니다.

+0

을 쓰는 것이 좋습니다. 사소한 것 같습니다. 유일한 문제는 테이블을 저장하는 방법입니다.이 테이블이 순수 C 인 경우 std :: map은 없지만 자신의 데이터 구조를 이미 가지고 있다고 생각하십니까? –

+0

sscanf % [..] 팁을 주셔서 감사합니다. 그러나 테스트를 마친 후에는 캐럿이 누락되었습니다. % [^ :] : % [^ \ n] "', 건배,이 길로 갈거야. . –

+0

수정되었습니다. 누락 된 캐럿을 유감으로 여긴다. – piotr

4

libini을 살펴보면 올바른 소리가 들립니다. 꽤 오래되었고 광란적인 발전을 정확히 겪고 있지는 않지만, 이미 문제를 해결해 준다면 괜찮을 것입니다.

더 많은 최신 혜택을 누릴 라이브러리는 glib이며, key-value-parser API입니다.

+0

나는 glib 옵션에 반대하여 내 요구 사항에 과잉이라고 판단했습니다. 라이브러리 질문을 직접적으로 해결하지는 못했지만 올바른 답을 선택하면 계속 진행하기가 쉬워졌으며 기존 데이터 파일에서 사용중인 기존 파일 사양을 손상시키지 않았습니다. –

+1

@James : 그건 괜찮습니다. 아마도 평범하지 않은 C 프로그램의 경우 glib은 그 프로그램에 자주 필요한 많은 것들을 추가하기 때문에 건강한 의존성이 있다고 생각하는 경향이 있습니다. 이 경우에는 – unwind

1

updated fork of libiniCCAN에 기여했습니다. 또한 간단한 사전 해싱 알고리즘뿐만 아니라 매우 유용한 사전 구현도 포함되어 있습니다. Rusty가 repo에 넣었으므로, 최신 데 이터를 가져 와서 사소한 버그를 수정하는 것이 합리적으로 좋은 일이었습니다.

라이브러리의 최신 버전은 poke through this tree이면 기본 토큰 지원과 기본 트랜잭션 지원을 포함합니다 (구성 파일을 다시 읽고 구문 분석 오류가있는 경우 유용). 또한 훨씬 더 업데이트 된 단위 테스트 세트가 포함되어 있습니다.

libini의 원래 작성자가 다시 활성화 되었기 때문에 나는 더 이상 포크를 더 이상 유지하지 않지만 모듈은 CCAN에서 유지 관리됩니다.

관련 문제