c - 逐 block 反转文件内容

标签 c linux

这是一个逐 block 反转文件内容的程序。

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

测试文件:

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

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

最佳答案

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

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

同样,写入输出需要是fwrite(buffer, count * need, 1, f2);

关于c - 逐 block 反转文件内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40317885/

相关文章:

c - 如何从用户空间使用 ioremap() api 在 uClinux 中读写 SPI Flash 存储器上的寄存器

c++ - 如何使用 cppunit 断言宏来检查返回数据类型的预处理器值?

c++ - 无法在 64 位 Debian 上运行 32 位二进制文​​件

linux - 您可以将 lamp 安装到网络硬盘上吗?

c - 汇编中的无符号整数

c++ - 我是否可以将嵌套的 lua 表作为 C 函数的参数读取?

c - os x swift 构建包管理器无法从 unixODBC C 依赖项中找到共享库

c - 在链表中插入第 n 个元素之后

GCC 中的 CLI 命令表

linux - USB 设备执行哪些 udev 规则?