在cygwin中使用tr

在cygwin中使用tr,c,C,我知道你们会的。笑着让我离开这里,但我要走了。我是一个完全的编程新手,完全自学成才,处理别人写的代码 我需要从文件中删除多余的空字符,它们没有任何用途,也不是行尾或文件结束标记。环顾四周,我发现了tr实用程序,我的一生都无法让它工作。我不断得到未声明的“tr”(首次在这个函数中使用) 有人能帮忙吗 c = pktdata[i-1] | tr -d '\000'; 您的示例几乎就像一个shell脚本,因此您可能需要以下内容: cat <yourfile> | tr -d '\000'

我知道你们会的。笑着让我离开这里,但我要走了。我是一个完全的编程新手,完全自学成才,处理别人写的代码

我需要从文件中删除多余的空字符,它们没有任何用途,也不是行尾或文件结束标记。环顾四周,我发现了tr实用程序,我的一生都无法让它工作。我不断得到未声明的“tr”(首次在这个函数中使用)

有人能帮忙吗

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

您的示例几乎就像一个shell脚本,因此您可能需要以下内容:

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

您是否将C与管道混合,就像它是一个shell解释器一样?你不能这么做。您的行类似于将带有tr的
pktdata[i-1]
的按位或的结果分配给c,减去d。。。语法错误(因为
'\000'
没有语法上的“位置”)

要对C语言中的文件进行操作,您需要
fopen
fclose
fread
fwrite
fsetpos
:将文件“移动”到文件末尾并向后读取,直到有东西出现!=达到0;然后,您可以使用
ftruncate
将其长度调整到指定的长度-但是ftruncate是POSIX,而不是C99或类似的(可能是cygwin拥有它)

您可以使用
fread
将所有文件(如果文件不大)读入缓冲区,然后找到正确的长度,并将其写回另一个文件或与读/写相同的文件

例如,一个trunc小程序可能看起来像

#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;
}
#包括
#包括
#定义MAXLEN 1024
int main(int argc,字符**argv)
{
龙我;
如果(argc<2)返回EXIT_成功;
char*buf=malloc(MAXLEN);
文件*fh=fopen(argv[1],“r”);
(无效)fseek(fh,0,SEEK_END);
长长度=英尺(fh);
如果(len>MAXLEN)
{
fclose(fh);
免费(buf);
返回退出失败;
}
倒带(fh);
(无效)fread(buf,1,len,fh);
fclose(fh);
fh=fopen(argv[1],“w”);
对于(i=len-1;i>=0&&buf[i]==0;i--);
i++;
如果(i>0)(无效)写入(buf,1,i,fh);
fclose(fh);
免费(buf);
返回退出成功;
}
(重要信息:根本没有错误检查)。但这并不是处理大型文件的最佳方式(目前它最多处理长度小于1024字节的文件)

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

编辑

出于某种原因,我将您的问题解释为删除尾部的空值。否则,在读取缓冲区中的文件后(保留相同的缺陷,即读取缓冲区中的所有内容而不是块…),如果字节不是0,则需要一个字节接一个字节地输出字节(您可以再次对其进行优化,以找到不包含0的块,然后立即重新写入)


前面的代码已修改,因此您可以从0循环到长度(不包括在内),如果是,则写入一个字节!=0,否则继续

仅用于学习,如果您想在C中使用任何类似shell的功能,请使用
系统
。通过shell cmd调用,您尝试执行的操作将很简单。

您能解释一下您的命令应该执行什么操作以及为什么要这样编写吗?为什么它被标记为“c”?这是源代码中的一行,还是您试图在shell中运行的命令?之所以会出现错误,是因为
tr
是一个shell实用程序,而不是一个c函数,您不能像这样将shell构造插入到c中。我一点也没笑。你真的希望我们教你基本的C编程吗?@larmans更重要的是,首先,指出他在编程和shell脚本之间的混淆谢谢你prusswan。我一边学习,一边把它扔在我的膝盖上,我不是一个程序员。感谢大家提供的帮助。系统调用编译得非常完美,现在看看是否有效。谢谢你提供的信息。