2012-05-10 10 views
1

私は、各行の終わりで^ Mを削除し、私は「RB +」に以下を実行しようとしているC.txtファイルの各行の末尾にある^ Mを削除します。

GLOBAL BOOLEAN CARRIER_CONSIGNOR_SIM_ReplaceZPL(CARRIER_CONSIGNOR_SIM_ORDER_TYPE* Header) 
{ 
    #define MAX_FILE_LEN 30 

    char filename[MAX_FILE_LEN]; 
    snprintf(filename, MAX_FILE_LEN, "%s.zpl", Header->OrderNumber); 

    FILE *file; 
    FILE *write; 
    char line [256]; 
    char linec [256]; 

    file = fopen(filename, "r"); 
    write = fopen(filename, "r+"); 

    if(file != NULL) 
    { 
    while (fgets (line, sizeof line, file) != NULL) /* read a line */ 
    { 
     strcpy(linec, line); 
     fprintf (write , linec); 
    } 
    /* Close both files */ 
    fclose (write); 
    fclose (file); 
    printf("REPLACED LABEL in %s\n", filename); 
    return (TRUE); 
    } 

return (FALSE); 
}/*CARRIER_CONSIGNOR_SIM_ReplaceZPL*/ 

に次のように持ってしようとしています

^XA^M 
^SZ2^JMA^M 
^MCY^PMN^M 
^PW822~JSN^M 
^JZY^M 
^LH0,0^LRN^M 
^XZ^M 
^XA^M 
^FO350,95^M 
^BY4^BCB,220,N,N,N,A^FD12345^FS 
^FT605,700^M 
^A0B,40,40^M 
^FB600,1,0,R,0^M 
^FD12345^FS 
^FT282,1160^M 
^A0B,28,39^FDBilka Tilst afdelingen^FS 
^FT320,1160^M 
^A0B,28,39^FDAgerøvej 7^FS 
^FT358,1160^M 
^A0B,28,39^FDPort 39^FS 
^FT396,1160^M 
^A0B,28,39^FDTilst^FS 
^FT434,1160^M 
^A0B,28,39^FDFLD_COUNTY_FLD^FS^M 
^FT472,1160^M 
^A0B,28,39^FD8381^FS 
^FT510,1160^M 
^A0B,28,39^FDFLD_COUNTRY_FLD^FS^M 
^FT548,1160^M 
^A0B,28,39^FDFLD_ORDERTEL_FLD^FS^M 
^FO660,100^M 
^GB0,720,2^FS^M 
^FO750,100^M 
^GB0,720,2^FS^M 
^FO660,820^M 
^GB92,0,2^FS^M 
^FO660,100^M 
^GB92,0,2^FS^M 
^FT680,810^M 
^A0B,18,23^FDDELIVERY INSTRUCTIONS:^FS^M 
^FT700,810^M 
^A0B,18,25^FDFLD_SPECIALINST1_FLD^FS^M 
^FT720,810^M 
^A0B,18,25^FDFLD_SPECIALINST2_FLD^FS^M 
^FT200,1160^M 
^A0B,80,90^FB1160,2,0,L,0^FDFLD_SERVICETEXT_FLD^FS^M 
^FT780,1160^M 
^A0B,18,20^FDSender's address: ^FS^M 

を以下していますfopenの書き込み=に、「R + BとRBが、これのどちらも^ Mを削除します。この問題に対処する最善の方法は何ですか。

+3

'man dos2unix' :-) –

+0

@Fredrik私はdos2unixを試しましたが、何かをインストールするように指示します。応答のための乾杯:) –

+0

専用のCプログラムをまとめるのではなく、 'perl -pi -e 's/\ r \ n/\ n/g'については [file2] [...]'? – smocking

答えて

2

あなたはただ、最後にAY \rまたは\nの文字を削除して文字列を短縮することができます変更:

... 
    strcpy(linec, line); 
    ... 

へ:

int len; 
    ... 
    strcpy(linec, line); 
    len = strlen(linec);     // get length of string 
    while (len > 0)      // while string not empty 
    {          // if last char is \r or \n 
     if (linec[len - 1] == '\r' || linec[len - 1] == '\n') 
     { 
      linec[len - 1] = '\0';   // delete it 
      len--; 
     } 
     else        // otherwise we found the last "real" character 
      break; 
    } 
    ... 

(注)文字列を印刷するときには、例えば、改行を追加する必要があること使用する

fprintf(write, "%s\n", linec); 
+3

ダーン - 誰かが私にそれを打つ。 –

+0

'strcpy(linec、line); len = strlen(linec); // len> 0 && linec [len-1] == '\ r')//最後の文字が^ Mの場合 { linec [len-1] = '\ 0'; //文字列の長さを取得します。 } fprintf(write、linec); 「今、デバッグしようとしています。私はint lenを宣言しました。私のファイルの一番上に。それでも私には同じ出力が得られますが、次の行に行くので最後の文字として考えるのではないと思います。 '^ XA \ r \ n \' –

+1

私の答えで言及したように、私はこれが正しいとは思わない。なぜなら、行は本当に '\ r'で終わると仮定しているからだ。実際には\ r \ nのペアがあります。 – unwind

1

表示されている^ Mは、キャリッジリターン(CR、0x0d)文字を表す方法です。それに続いて、ほとんどのUnixツールの行を終わらせる改行文字が続きます。このテキストファイルはおそらくWindowsプログラムによって作成されたものです。

ファイルをバイナリモードで開くと、値が'\r'(キャリッジリターンの書き方)であるすべての文字を削除できるはずです。

ポールRの提案は'\r'に続く'\n'を実現することができないので、私はそれが動作するとは思わない。右の行を読んだ後

char *cr; 

... 

if((cr = strchr(line, '\r')) != NULL) 
{ 
*cr++ = '\n'; 
if(*cr == '\n') 
    *cr = '\0'; 
} 

あなたは、しかし、のような何かを行うことができます。これはテキストモードでも機能します。

+0

バッファコンテンツとして完全なファイルをstrchr(バッファ、 '\ n')に使用し、^ Mを ""に置き換えるのはどうですか?これは単純にそれらを削除し、残りを無視します。それがトラブルを引き起こすかもしれないと思いますか? –

関連する問題