2009-06-28 2 views
3

가공하는 동안 내 프로그램이 유닉스 풍차를 표시하도록하고 싶습니다. printf와 기능 루프 모든 반복에있다 프로그래머의 :C++의 이상한 stdout 동작

printf("Fetching articles (%c)\r",q); 

q는 풍차의 문자 중 하나입니다 - | 반복 수에 따라 (\ /).

문제는 - 100 회 반복 에서처럼 표시된 줄에 두 가지 변경 사항 만있는 것처럼 보입니다. 모든 반복에는 완료하는 데 약 1 초가 걸립니다.

무엇을 할 수 있습니까? 일반적 stdout 버퍼링 만 덤프된다 이렇게없이

printf("Fetching articles (%c)\r",q); 
fflush(stdout); 

각 라인을 작성 후

for (int i=0;i<numb_articles;i++) { 
    memset(file_path,0x0,BUFF_SIZE); 

    url=article_urls[i]; 

    if (rules->print!=NO_PRINT) { 
    url=modify_url(url,rules->printout,rules->print); 
    if (url=="NULL") 
     continue; 
    } 

    get_page(url,file_content); 

    if (strcmp(rules->save.data(),"NULL")!=0) 
    if (!check_save(rules->save,file_content,url)) 
     continue; 

    at_least_one_saved=true; 
    numb_articles_accepted++; 

    encoding_list[i]=get_encoding(file_content); 

    title=get_title(file_content,err_msg); 

    if (title=="") 
    continue; 

    title_list[i]=strdup(title.data()); 
    filename=get_filename(title); 

    int count=numb_fn_found(filename_list,i,filename.data()); 
    char *tmp = new char[10]; 
    if (count>0) { 
    sprintf(tmp,"(%d)",count); 
    filename.insert((size_t)filename.length(),tmp); 
    } 

    filename_list[i]=strdup(filename.data()); 

    char q; 
    if (i%2==0) 
    q='|'; 
    else q='-'; 

    printf("Fetching articles (%c)\r",q); 

    ofstream output_file; 
    sprintf(file_path,TMP_FILE,filename.data()); 
    strncat(file_path,".html",5); 
    output_file.open(file_path); 

    output_file << file_content; 

    output_file.close(); 
} 

답변

9

세척 출력 :

여기 풍차에서만 두 가지 문자와 전체 루프의 새 라인이 보일 때 출력되거나 내부 버퍼가 가득 차게된다.

+0

감사합니다, 즐기십시오 : 의 printf ("\ r을을"); printf ("기사 가져 오기 (% c)", q); fflush (stdout); –

+0

@Bartek, 아, 텍스트 뒤의 \ r을 혼란스럽게 만들었습니다. :) –

2

출력 (콘솔)이 버퍼링됩니다. 즉, 버퍼가 가득 차거나 개행 문자가 쓰여질 때만 출력을 화면에 씁니다. 문자를 한 번에 하나씩 출력하려면 fflush (stdout)을 명시 적으로 호출하여 출력 버퍼를 비워야합니다.

로버트 C. Cartaino에게, 난 단지 이런 식으로 작성했습니다 일

+0

캐리지 리턴에 관한 부분은 인쇄되고있는 문자이기 때문에 캐스팅 리턴에 관한 부분을 고를 수 있습니다. –

+0

수정 됨. 나는 기술적으로 전체 버퍼가 쓰려고 할 때까지 플러시하지 않는다는 것을 제외했다. 그리고 몇 가지 다른 이유가있다. –