我知道你们会有疑问。把我从这里笑出来,但这里走了。我是一个完整的编程新手,完全自学成才,处理别人写的代码。
我需要从文件中删除多余的空字符,它们没有用处,也不是行尾或文件结束标记。环顾四周,我找到了tr实用工具,不能为我的生活做好准备。我一直得到:'tr'未声明(首次使用此功能)。
任何人都可以提供帮助
c = pktdata[i-1] | tr -d '\000';
答案 0 :(得分:2)
您是否将C与管道混合,如果它是shell解释器?你不能这样做。您的行就像是按c或pktdata[i-1]
的结果分配给c,减去d ...语法错误(因为'\000'
没有句法“地点”)。
要对C中的文件进行操作,您需要fopen
,fclose
,fread
,fwrite
,fsetpos
:您“移动”到结尾处文件并向后读取,直到达到某些东西!= 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调用,您要做的事情很容易。