逐块反转文件内容

时间:2016-10-29 09:51:56

标签: c linux

所以这是一个逐块反转文件内容的程序。

#include <stdio.h>
#include <stdlib.h>
#define BS 12

void reverse(char * buffer, int size)
{
  char tmp;
  int i;
  for(i = 0; i < size / 2; i++)
  {
    tmp = (char)buffer[i];
    buffer[i] = buffer[size - i - 1];
    buffer[size - i - 1] = tmp;
  }
}

int main (const int argc, const char** argv)
{
  if(argc != 3)
    exit(-1);

  char * buffer = malloc(BS);
  FILE * f1, * f2;
  f1 = fopen(argv[1], "r");
  f2 = fopen(argv[2], "w");

  fseek(f1, 0, SEEK_END);

  long i = ftell(f1);
  // long f1_len = ftell(f1);
  // unsigned char tmp;
  int if_end = 1;
  int need = 0;
  int count;


  do
  {
    i = i - BS;
    if(i < 0)
    {
      need = BS - abs(i);
      i = 0;
    }
    else
      need = BS;

    fseek(f1, i, SEEK_SET);

    if(if_end) // strip EOF
    {
      count = fread(buffer, need - 1, 1, f1);
      if_end = 0;
    }
    else
      count = fread(buffer, need, 1, f1);

    reverse(buffer, count);
    fwrite(buffer, count, 1, f2);

    if(i == 0)
      break;
  }while(i > 0);


  fclose(f1);
  fclose(f2);
  free(buffer);

    return 0;
}

testfile的:

$ xxd testfile
0000000: 6162 6364 6566 670a                      abcdefg.
$ gcc test.c -o test
$ ./test testfile testfile2
$ xxd testfile2
0000000: 61                                       a

知道哪里出错了?我已经调试了很长时间了。

1 个答案:

答案 0 :(得分:1)

您的问题是fwrite返回成功块的数量,而不是字节数。

所以reverse(buffer, count);需要reverse(buffer,count * need)

Similairly对输出的写入需要是fwrite(buffer, count * need, 1, f2);