2011-07-22 1 views
0

私はあなたたちがprobだろう知っています。ここから私を笑いながらここに行く。私は完全に自己学習し、誰か他の人が書いたコードを扱う、プログラミングの初心者です。cygwinでtrを使用しています

ファイルから余分なヌル文字を削除する必要がありますが、目的を果たせず、行末やファイルの終わりのマーカーではありません。周りを見回して私はtrのユーティリティを見つけ、私の人生のためにそれを動作させることはできません。私は取得し続けています: 'tr'は宣言されていません(この関数の最初の使用)。

誰が

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

あなたのコマンドが何をすべきか、なぜこのように書いたのか説明できますか?なぜそれは 'c'とタグ付けされていますか? –

+0

は、ソースコードの行、またはシェルで実行しようとしているコマンドですか? – prusswan

+0

'tr'はCユーティリティではなくシェルユーティリティであるため、エラーが発生します。このようにCにシェル構造を挿入するだけでは不十分です。私は全く笑っていません。基本的なCプログラミングを教えてくれると本当に思いますか? –

答えて

2

あなたはパイプとCを混合していますがシェルインタプリタ?あなたはそれをすることはできません。あなたの行は、bitwiseの結果をpktdata[i-1]に、trを減算すると...構文エラー('\000'には構文的な "場所"がないので)を割り当てるようなものです。 C内のファイルを操作する

あなたがfopenfclosefreadfwritefsetposを必要とする:あなたは、ファイルの末尾に「移動」と何かになるまで後方にそれを読ん= 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となるように、前のコードが変更されています。

0

あなたの例では、ほとんどのシェルスクリプトのようなものですので、おそらくあなたはこれらの線に沿って何かを必要とするのに役立ちます。それはであるかのように

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

ちょうどあなたの学習のために、Cのシェルのような機能を使いたい場合はsystemを使います。あなたがしようとしていることは、シェルのcmd呼び出しで簡単になります。

+0

システムコールが完全にコンパイルされ、動作するかどうかを確認します。少しの情報をありがとうございます。 – PGFDBUG

+0

もちろん、そうでない場合はコードを共有してください。 – hari

関連する問題