我知道你們會問。笑我離開這裏,但這裏。我是編程的完全新手,完全自學,處理別人寫的代碼。在cygwin中使用tr
我需要從一個文件中刪除多餘的空字符,它們沒有用處,也不是行結束或文件結束標記。環顧四周,我發現了tr實用程序,並不能爲我的生活做好準備。我一直得到:'tr'未聲明(首次在此函數中使用)。
誰能幫助
c = pktdata[i-1] | tr -d '\000';
我知道你們會問。笑我離開這裏,但這裏。我是編程的完全新手,完全自學,處理別人寫的代碼。在cygwin中使用tr
我需要從一個文件中刪除多餘的空字符,它們沒有用處,也不是行結束或文件結束標記。環顧四周,我發現了tr實用程序,並不能爲我的生活做好準備。我一直得到:'tr'未聲明(首次在此函數中使用)。
誰能幫助
c = pktdata[i-1] | tr -d '\000';
你混合下,用管一樣,如果它是一個shell解釋器?你做不到。您的行類似於將tr或pktdata[i-1]
與tr相減的結果分配給c,減去d ...語法錯誤(因爲'\000'
沒有語法「地點」)。
要在你需要fopen
,fclose
,fread
,fwrite
,fsetpos
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
。
你舉的例子是幾乎像一個shell腳本,所以也許你需要沿着這些路線的東西:
cat <yourfile> | tr -d '\000'
你能解釋一下你的命令應該做什麼以及爲什麼你這樣寫它?爲什麼標記'c'? –
是源代碼中的一行還是您嘗試在shell中運行的命令? – prusswan
你會得到這個錯誤,因爲'tr'是一個shell實用程序,而不是C函數,你不能像這樣插入shell結構到C中。我根本不笑。你真的期望我們教你基本的C編程嗎? –