2011-03-29 126 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字节)分配一次并始终使用它。