2012-01-03 3 views
0

그래서 저는 삶의 게임을 구현했으며 이제는 생성 된 모든 새로운 필드를 gif 또는 pbm에 넣어야하고 마지막에는 애니메이션 GIF를 만드는 명령이 있습니다.C의 삶의 게임, 어떻게 파일에 씁니까?

아래 함수는 제공되지만 첫 번째 매개 변수 인 포인터 const char이 없습니까? 함수에서 파일 이름을 보았습니다. 어떻게 쓰는지, 정말 혼란 스럽습니다.

static int write_pbm_file(const char *fn, struct game_field *gf) { 
int i, j; 
FILE *fp; 


fp = fopen(fn, "w+"); 
if(!fp){ 
    printf("unable to open '%s' - '%s'\n", fn, strerror(errno)); 

    return -1; 
} 

fprintf(fp, "P1\n"); 
fprintf(fp, "%c\n", gf->length); 
fprintf(fp, "%c\n", gf->length); 

for(i = 0; i < gf->length; i++) 
    for(j = 0; j < gf->length; j++) 
     fprintf(fp, "%c\n", gf->field[i][j] == 0 ? 48 : 
     gf->field[i][j] == 1 ? 219 : 197); 

fclose(fp); 

return 0; 
} 

그건 내가 위의 함수에 도착 어디에 코드입니다 :

while(iterations > 0) { 
    write_pbm_file(..., pstField); 
    pstField = game_iteration(pstField); 
    iterations--; 
} 

나는이 파일을 작성하려면 어떻게 작성해야? 도와주세요

고마워요!

답변

1

: 당신은 아마하지만, 각 반복에 대한 파일 이름을 변경하려면

write_pbm_file("life.pbm", pstField); 

. 이 같은 아마 뭔가 :

char filename[100]; 

while(...) 
{ 
sprintf(filename, "life-%03d.pbm", iteration); 
write_pbm_file(filename, pstField); 

이 (역으로 계산)하여 iteration 카운터를 재 - 사용하기 때문에 첫 번째 파일이 가장 큰 수있을 것이다 기록 될 수 있습니다. 나는 세 자릿수에 0- 채우기를 추가했다. 물론 필요한 반복 수를 알지 못한다. 당신을 가정

+0

그 해결책은 완벽합니다. 모든 새로운 분야마다 새로운 파일을 만들고 작동합니다. 나는 리눅스 atm을 가지고 있지 않다. 숙제는 다음과 같이 감추어 진 pbm으로 변환한다. convert -delay 75 -loop 0 field * game_of_life.gif 두 가지 질문 : 윈도우 7 x64에서는 convert가 작동하지 않는다. 다른 어떤 방법으로? 필드 대신 *을 사용해야합니까? file-NUM.pbm이라는 10 개의 파일을 만들 수 있으며이 명령에 대해 지금 무엇을 작성해야합니까? 정말 고맙습니다. – pfu

+0

convert는 ImageMagick의 일부입니다 : http://www.imagemagick.org/script/binary-releases.php#windows 대신에 field * try 파일 - *. pbm –

+0

흠 잘 작동하지만 gif가 생성되지만 애니메이션이 아닙니다. . pbm 파일은 모두 다르지만 GIF는 정적입니다. 애니메이션이 없습니다. 흠 .. 내 기술을 부끄럽게 생각합니다. 초보자입니다 ^^ – pfu

1

매개 변수 fn은 단순히 파일 경로입니다. 유닉스 시스템에서는 쓸 것이므로 "/home/someuser/somefile.ext"이라고 쓸 수있다. "C:\\Some\\Path\\somefile.ext"

argv[1]을 사용하여 프로그램 인수를 통해 구성 할 수도있다. 예컨대 :

비 변경 문자 데이터에 대한 포인터가 가장 쉽게 단지 리터럴 문자열을 사용하여 제조 할 수있다
int main(int argc, char** argv) { 
    if (argc < 1) exit(1); 
    char* filename = argv[1]; 

    ... 
    while(iterations > 0) { 
     write_pbm_file(filename, pstField); 
     pstField = game_iteration(pstField); 
     iterations--; 
    } 
} 
+0

주요 함수에서 나는 길이, 반복 및 요인에 대해 이미 사용하고 있습니다. 하지만 지금은 감사하다는 생각이 무엇인지 압니다! – pfu

1

game_field field

write_pbm_file("/home/you/foo.pbm", &field); 

const char * 유형에 해당 문자열 리터럴, char *, const char []char [] 붕괴가 될 것 /home/you/foo.pbm, 말에 그것을 밖으로 쓰기.

관련 문제