2013-08-17 95 views
0

我創建了一個4000塊的文件,塊大小爲4096字節。我寫了一些特定的塊在這個文件中,現在我想讀取這些塊並將結果寫入一個新的輸出文件。C以二進制模式讀取文件並寫入輸出文件

所以我打開我的「RB」模式(storeFile)創建的文件,並在「WB」模式(OUTPUTFILE)的OUTPUTFILE如下:

FILE * outputFile=fopen(outputFilename,"wb"); 
FILE * storeFile=fopen(storeFilename, "rb"); 

我正努力尋求合適的位置和讀取所有塊到新文件(OUTPUTFILE):

for(i=0; i<BlocksUsed; i++) 
{ 
    fseek(storeFile,blocksToRead[i]*4096,SEEK_SET); 
    fread(ptr, 4096,1,storeFile); 
    fwrite(ptr,4096,1outputFile); 
    ... 
    rewind(storeFile) 
} 

可惜這種代碼將導致一個文件,不是我寫的storeFile文件。 文件大小爲BlockUsed * 4096Bytes。

我在做什麼錯?

預先感謝您!

+0

是什麼blocksToRead數組,它是什麼? –

+0

有我早先寫的塊數。 – SevenOfNine

+0

1)我沒有看到你在檢查「文件打開」或「文件讀取」錯誤的位置,2)你可能不需要你的循環中的「fseek()」或「rewind()」* * – paulsm4

回答

0
fseek(storeFile,blocksToRead[i]*4096,SEEK_SET); 
int n = fread(ptr, 4096,1,storeFile); 
if (n <0) 
{printf("read error\n");return -1;} 
if(fwrite(ptr,n,1outputFile) != n) 
{printf("write error\n"); return -1;} 
    ... 
//rewind(storeFile)// no need . since you use fseek 
0

這是一個愚蠢的例子,但它可能有助於說明幾點:

#include <stdio.h> 

int 
main (int argc, char *argv[]) 
{ 
    FILE *fp_in, *fp_out; 
    int c; 

    /* Check command-line */ 
    if (argc != 3) { 
    printf ("EXAMPLE USAGE: ./mycp <INFILEE> <OUTFILE>\n"); 
    return 1; 
    } 

    /* Open files */ 
    if (!(fp_in = fopen(argv[1], "rb"))) { 
    perror("input file open error"); 
    return 1; 
    } 

    if (!(fp_out = fopen(argv[2], "wb"))) { 
    perror("output file open error"); 
    return 1; 
    } 

    /* Copy bytewise */ 
    while ((c = fgetc(fp_in)) != EOF) 
    fputc (c, fp_out); 

    /* Close files */ 
    fclose (fp_out); 
    fclose (fp_in); 
    return 0; 
} 
相關問題