2011-03-29 5 views
0

재미있는 프로젝트로서 iso 파일을 만드는 프로그램을 작성한다고 생각했습니다. 내가 할 수있는 한, 작동하지만 30 초마다 4KB 만 읽는다. 합리적인 속도로 CD-ROM 드라이브를 느리게하려면 eject -x 11을 사용했습니다. 드라이브가 없으면 드라이브가 최대 속도로 실행되고 프로세스가 상당히 빨리 종료됩니다. 이 방법을 더 빨리/더 좋게 만들 수있는 제안은 많이 감사하겠습니다.C에서 느린 디스크 이미지 생성 (iso 9660)

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#define BUFFSIZE 4092 

int main(int argc, char **argv) 
{ 
    FILE *fp = fopen("/dev/cdrom", "r"); 
    FILE *file = fopen(strcat(argv[1], ".iso"), "w"); 

    printf("Copying...\n"); 

    while(!feof(fp)) 
    { 
     char *line=(char *)malloc(sizeof(char) * BUFFSIZE); 
     fgets(line, BUFFSIZE, fp); 
     fprintf(file, "%s",line); 

     free(line); 
    }//end while 

    fclose(fp); 
    fclose(file); 

    printf("Done!\n"); 

    return 0; 
}//end main 
+0

파일을 이진 모드로 열려고합니다. argv [1]'을 덮어 쓰는 것은 나쁜 생각입니다. 캐스트를 제거 – pmg

+2

문자열 함수의 굵게 사용하여 임의의 이진 데이터를 읽고 쓸 수 있습니다 ... –

답변

1
  • 버퍼 IO이 시나리오 에 거의 적합 아니하며 개행의 입력을 검사는 fgets이다. 을 mmap에 입력하십시오.
  • 연속 버퍼 다시 할당하면 속도가 느려집니다.
  • Fprintf는 바이너리 데이터 쓰기에 적합하지 않습니다. 천천히.
0

나는 C 전문가가 아니지만 성능 향상을 확인하기 위해 버퍼링 된 독자 및 데이터 작성자의 일부 형식을 구현해야하는 것처럼 들립니다.

-1

mallocfree을 루프 외부로 이동하십시오.

3

fgets()은 텍스트를 처리하며 줄 중심이며 줄 바꿈을 찾는 데 시간을 낭비합니다. 또한 fprintf()NUL 바이트를 처리하지 않으며 매우 혼란 스러울 수 있습니다. 이진 IO를 사용하고 싶습니다 (예 : fread()fwrite()). 지속적으로 free()을 수행 할 필요가 없으며 버퍼를 다시 할당하십시오.

C 래퍼 대신 Unix IO 프리미티브를 사용하려면 read()write() 또는 mmap()을 대신 사용할 수 있습니다. 모든

+0

그 버퍼를 (많이) 크게 만듭니다 – Mat

0

첫째, 나는 포맷 입력 (fgets & 텍스트 모드)로 이동하지만,하지 않을합니다 (b 플래그, 쓰기 freadfwritefopen) 원시 이진 입력이. 이렇게하면 stdio는 텍스트 모드에 필요한 대체를 수행 할 필요가 없으며 \n을 기다리는 fgets '보다 우수한 수행해야하는 일련의 고정 크기 읽기를 가질 수 있습니다.

그런 다음 동적 메모리 할당을 제거합니다. 연속 할당/할당 해제로 인해 응용 프로그램의 성능이 저하 될 수 있습니다. 스택에있는 모든 정적 버퍼 (예 : 8192 바이트)에 대해 한 번만 할당하고 항상 사용하십시오.