2011-07-22 73 views
0

我知道你們會問。笑我離開這裏,但這裏。我是編程的完全新手,完全自學,處理別人寫的代碼。在cygwin中使用tr

我需要從一個文件中刪除多餘的空字符,它們沒有用處,也不是行結束或文件結束標記。環顧四周,我發現了tr實用程序,並不能爲我的生活做好準備。我一直得到:'tr'未聲明(首次在此函數中使用)。

誰能幫助

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

你能解釋一下你的命令應該做什麼以及爲什麼你這樣寫它?爲什麼標記'c'? –

+0

是源代碼中的一行還是您嘗試在shell中運行的命令? – prusswan

+0

你會得到這個錯誤,因爲'tr'是一個shell實用程序,而不是C函數,你不能像這樣插入shell結構到C中。我根本不笑。你真的期望我們教你基本的C編程嗎? –

回答

2

你混合下,用管一樣,如果它是一個shell解釋器?你做不到。您的行類似於將tr或pktdata[i-1]與tr相減的結果分配給c,減去d ...語法錯誤(因爲'\000'沒有語法「地點」)。

要在你需要fopenfclosefreadfwritefsetpos C對文件進行操作:在「移動」到文件末尾和向後讀它,直到事= 0是達到了;!那麼你可以使用ftruncate來縮短它的長度,但ftruncate是POSIX,而不是C99或類似的(可能是cygwin擁有它)。

你可以閱讀所有的文件(如果不是大)到緩衝區與fread,然後找到正確的長度,並將其寫回到另一個文件或打開讀/寫一樣。

E.g.一個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肯定更好;如果所選的「窗口」僅包含0,則可以讀取最後N個字節,搜索零並相應地減小長度,然後向後讀取其他N個字節等;最後,你的最終計算長度將是你文件的長度,你可以使用ftruncate。

編輯

出於某種原因,我理解你的問題是消除拖尾空。如果不是這樣,你需要在讀取緩衝區中的文件(保持相同的缺陷,即全部讀入緩衝區而不僅僅是塊)之後,在字節之後輸出字節,如果它們不是0(您可以再次優化它找到不包含0的塊並一次寫入它們)。

上面的代碼被修改,以便您從0循環到長度(不包括),並寫入一個字節iff =!0,否則爲continue

0

你舉的例子是幾乎像一個shell腳本,所以也許你需要沿着這些路線的東西:

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

只是爲了您的學習,如果您想在C中使用任何類似shell的功能,請使用system。使用shell cmd調用您試圖執行的操作將很容易。

+0

系統調用完美編譯,現在看看它是否工作。感謝您提供的信息。 – PGFDBUG

+0

當然,如果沒有,共享代碼。 – hari