あなたはパイプとCを混合していますがシェルインタプリタ?あなたはそれをすることはできません。あなたの行は、bitwiseの結果をpktdata[i-1]
に、trを減算すると...構文エラー('\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;
}
(重要エラーチェックが全く存在しない)ようになります。しかし、これは巨大なファイルを扱うのが最善ではありません(現在はほとんどの場合、1024バイト以下のファイルを扱います)。
ftruncateの使用は確実です。最後のNバイトを読み込み、ゼロを検索し、それに応じて長さを減らすことができます。選択された「ウィンドウ」に0のみが含まれている場合は、他のNバイトを逆読みします。最後に計算された長さはファイルの長さになり、ftruncateを使用することができます。
EDIT
私は末尾のNULLを削除するなどあなたの質問を解釈してきたいくつかの理由。そうでない場合は、バッファ内のファイルを読み込んだ後で(同じ不具合、つまりチャンクの代わりにバッファにすべてを読み込む...)、バイト後のバイトを出力します。 0を含まないブロックを見つけ出し、一度にそれらを書き込む)。
0からその長さ(包括的ではない)までループし、!= 0の場合は1バイトを書き込むように、それ以外の場合はcontinue
となるように、前のコードが変更されています。
あなたのコマンドが何をすべきか、なぜこのように書いたのか説明できますか?なぜそれは 'c'とタグ付けされていますか? –
は、ソースコードの行、またはシェルで実行しようとしているコマンドですか? – prusswan
'tr'はCユーティリティではなくシェルユーティリティであるため、エラーが発生します。このようにCにシェル構造を挿入するだけでは不十分です。私は全く笑っていません。基本的なCプログラミングを教えてくれると本当に思いますか? –