在cygwin中使用tr

时间:2011-07-22 21:13:13

标签: c

我知道你们会有疑问。把我从这里笑出来,但这里走了。我是一个完整的编程新手,完全自学成才,处理别人写的代码。

我需要从文件中删除多余的空字符,它们没有用处,也不是行尾或文件结束标记。环顾四周,我找到了tr实用工具,不能为我的生活做好准备。我一直得到:'tr'未声明(首次使用此功能)。

任何人都可以提供帮助

c = pktdata[i-1] | tr -d '\000';

3 个答案:

答案 0 :(得分:2)

您是否将C与管道混合,如果它是shell解释器?你不能这样做。您的行就像是按c或pktdata[i-1]的结果分配给c,减去d ...语法错误(因为'\000'没有句法“地点”)。

要对C中的文件进行操作,您需要fopenfclosefreadfwritefsetpos:您“移动”到结尾处文件并向后读取,直到达到某些东西!= 0;然后你可以使用ftruncate将其长度截断为所需的 - 但是ftruncate是POSIX,而不是C99或类似的(很可能是cygwin拥有它)。

您可以将所有文件(如果它不大)读入带有fread的缓冲区,然后找到正确的长度,并将其写回另一个文件或打开的读/写文件。

E.g。一个小小的程序可能看起来像

#include <stdio.h>
#include <stdlib.h>

#define MAXLEN 1024

int main(int argc, char **argv)
{
  long i;
  if (argc < 2) return EXIT_SUCCESS;
  char *buf = malloc(MAXLEN);
  FILE *fh = fopen(argv[1], "r");
  (void)fseek(fh, 0, SEEK_END);
  long len = ftell(fh);
  if (len > MAXLEN)
  {
    fclose(fh);
    free(buf);
    return EXIT_FAILURE;
  }
  rewind(fh);
  (void)fread(buf, 1, len, fh);
  fclose(fh);
  fh = fopen(argv[1], "w");
  for(i = len-1; i >= 0 && buf[i] == 0; i--) ;
  i++;
  if (i > 0) (void)fwrite(buf, 1, i, fh);
  fclose(fh);
  free(buf);
  return EXIT_SUCCESS;
}

重要根本没有错误检查)。但这不适合处理大文件(目前它处理大多数长度小于1024字节的文件)。

使用ftruncate肯定更好;您可以读取最后N个字节,搜索零并相应地减小长度,如果所选的“窗口”仅包含0,则向后读取其他N个字节,依此类推;最后,您的最终计算长度将是文件的长度,您可以使用ftruncate。

修改

出于某种原因,我将您的问题解释为删除尾随空值。不是这样,你需要,在你读取缓冲区中的文件后(保持相同的缺陷,即全部读入缓冲区而不是只是块...),输出字节后的字节,如果它们不是0(你再次可以优化)它找到不包含0的块并一次性写入它们。)

修改前面的代码,以便从0循环到长度(不包括)并且如果它是!= 0则写入单个字节,否则continue

答案 1 :(得分:0)

你的例子几乎就像一个shell脚本,所以也许你需要这些内容:

cat <yourfile> | tr -d '\000'

答案 2 :(得分:0)

仅为了您的学习,如果您想在C中使用任何类似shell的功能,请使用system。通过shell cmd调用,您要做的事情很容易。