【问题标题】:C reading a File in binarymode and write to an output fileC以二进制模式读取文件并写入输出文件
【发布时间】:2013-08-17 22:20:50
【问题描述】:

我创建了一个包含 4000 个块的文件,块大小为 4096 字节。我写了这个文件中的一些特定块,现在我想读取这些块并将结果写入一个新的输出文件。

因此我打开我在“rb”模式下创建的文件(storeFile)和在“wb”模式下的输出文件(outputFile)如下:

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

现在我正在尝试寻找正确的位置并将所有块读取到新文件(输出文件):

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。

我做错了什么?

提前感谢您!

【问题讨论】:

  • 什么是 blocksToRead 数组,里面有什么?
  • 有我之前写的块数。
  • 1) 我看不到您在哪里检查“文件打开”或“文件读取”错误,2) 您可能不需要“fseek()”或“rewind() " inside 你的循环
  • 如果您使用带有 fseek() 的直接访问文件,则没有理由使用 rewind(),这实际上是用于顺序文件。您实际上想用这段代码做什么?如果输出文件为空并且您正在读取 BlocksUsed 的 4096 块数,那么为什么输出文件不会以相同数量的块结束?
  • 文件打开没有问题。我检查了这个,但没有发布这个。嗯,我怎么不需要 fseek?那我怎么来我的位置呢?例如,如果我需要阅读 BLock 2 5 和 10?

标签: c fopen fwrite fread


【解决方案1】:
 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 

【讨论】:

    【解决方案2】:

    这是一个愚蠢的例子,但它可能有助于说明几点:

    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-07
      相关资源
      最近更新 更多