2011-03-29 30 views
0

作爲一個有趣的項目,我想我會寫一個程序來製作iso文件。據我所知,它可以工作,但每30秒只讀取4KB。我使用彈出-x 11將我的光驅驅動器放慢到合理的速度。如果沒有它,驅動器將全速運行,並且很快就會殺死該進程。任何建議,使這更快/更好將非常感激。真的很慢的光盤鏡像創建(ISO 9660)在C

#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 2011-03-29 21:39:25

+2

大膽使用字符串函數來讀/寫任意二進制數據... – 2011-03-29 21:40:55

回答

1
  • 緩衝IO是在幾乎不 適當這種情況下,也不是與fgets其中 掃描換行輸入。將 分爲mmap
  • 連續緩衝區 取消/重新分配會減慢您的速度。
  • Fprintf不適合寫入二進制數據。它也很慢。
0

我不是C大師,但聽起來你需要實現某種形式的緩衝讀寫器和數據寫入器以查看性能改進。

-1

mallocfree移到循環外部。

3

fgets()處理文本和麪向行,浪費時間尋找換行符。此外,它和fprintf()不處理NUL字節,並可能會讓他們很困惑。您想要使用二進制IO,即fread()fwrite()。也不需要連續地free()並重新分配您的緩衝區。

如果您想要使用Unix IO原語而不是C封裝器,則可以使用read()write()mmap()來代替。

+0

那,並使緩衝區(多)更大 – Mat 2011-03-29 21:42:37

0

首先,我不會格式化輸入(fgets &文本模式)去,但與原始二進制輸入(fopenb標誌,freadfwrite寫作)。這種方式stdio不需要執行文本模式所需的替換(如果您的平臺需要),並且您有一系列固定大小的讀取應該比fgets'等待\n更好。

然後,我會擺脫動態內存分配;連續分配/釋放可能會導致應用程序性能下降。只需爲堆棧中的所有靜態緩衝區(例如8192字節)分配一次並始終使用它。