2013-10-04 5 views
0

저는 C에 매우 익숙하고 스파 스 매트릭스를 파일에 쓰는 기능을 구현했습니다. 파일에 쓰기 전에 C에서 문자열을 작성하는 올바른 방법이 무엇인지 궁금합니다.C - 작성하기 전에 문자열 작성하기

나는 현재 write()이라고 부르며 실적이 저조합니다. 문자열을 포맷하고 루프 내에서 순차적으로 빌드해야합니다. 자바에서는 StringBuilder을 사용 하겠지만 C 언어에 대해서는 알지 못합니다.

여기에 내가

int i; 
unsigned int u; 
for(i=0 ; someCondition ; i++) { 
    if(someOtherCondition) 
     dprintf(fileDescr, "I need to write this unsigned int %u\n", u); 
    else 
     write(fileDescr, "0", sizeof(char)); 
} 

이 작업을 수행 할 수있는 적절한 C의 방법은 무엇인가 할 싶어 무엇의 단순화 된 버전이다?

+0

['snprintf'] (http://en.cppreference.com/w/c/io/fprintf) (또는 ['_snprintf'] (http://msdn.microsoft. com/ko-kr/library/2ts7cx93.aspx)를 참조하십시오. –

답변

1

나는 현재 write()를 많이 호출하여 결과가 좋지 않아서 공연을합니다.

시스템 호출이 "정상적인"작업보다 비싸기 때문에 버퍼링을 수행해야합니다.

  • 당신은 단순히 표준 라이브러리를 사용할 수 있습니다 - FILE * 얻을 fwrite 전화 -이 자동으로

  • 당신은, 버퍼에 추가 mempcy 친구를 사용하여 자신의 버퍼링을 위해 할 수있는 버퍼링 할 것입니다. 버퍼가 가득 차면 당신은 단순히 쉽게로 큰 write

내가 먼저 stdio 접근을 시도 할 것이라고 할 수있다. 파일 설명자에서 FILE *을 가져 오는 방법을 알고 싶다면 POSIX 표준 fdopen을 찾으십시오.

0

대부분이 sprintf()realloc()입니다.

// all error checks omitted for clarity, you are NOT allowed to do this 
size_t allocsz = 0x40; 
size_t len = 0; 
char *buf = malloc(allocsz); // initial buffer size 

for (; someCondition; i++) { 
    int n = snprintf(
     NULL, 0, 
     "Format %s so that it %s with %u", "this", "works", 1337u 
    ); 

    if (len + n >= allocsz) { 
     while (len + n >= allocsz) { // exponential storage expansion 
      allocsz *= 2; 
     } 

     buf = realloc(buf, allocsz); 
    } 

    snprintf(
     buf + len, n + 1, 
     "Format %s so that it %s with %u", "this", "works", 1337 
    ); 

    len += n; 
} 

write(fd, buf, len); 
관련 문제