0

ブロックサイズが 4096 バイトの 4000 ブロックのファイルを作成しました。このファイル内のいくつかの特定のブロックに書き込みを行いましたが、これらのブロックを読み取り、結果を新しい出力ファイルに書き込みたいと考えています。

したがって、次のように、「rb」モードで作成したファイル (storeFile) と「wb」モードで出力ファイル (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 です。

私は何を間違っていますか?

前もって感謝します!

4

2 に答える 2

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 
于 2013-08-17T23:13:36.597 に答える
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;
}
于 2013-08-17T22:50:24.000 に答える