2012-05-10 3 views
1

나는 "+ RB"각 라인의 끝에 M이, 그리고 다음 일을 내가 시도 .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*/ 

C

에 다음 한

^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

'perl -pi -e 's/\ r \ n/\ n/g에 대한 방법은 C 전용 프로그램을 만드는 대신에 [file2] [...]'? – smocking

답변

2

당신은 단지 끝에서 바깥 \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을 선언했다. 내 파일 맨. 그것은 여전히 ​​나에게 같은 결과를 주지만 나는 그것이 다음 줄로 가기 때문에^M을 마지막 문자로 생각하지 않는다고 생각한다. gdb를 실행할 때 다음과 같은 결과가 나옵니다.'^ 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을 ""로 바꾸는 방법은 무엇입니까? 이렇게하면 간단히 제거되고 나머지는 무시됩니다. 그게 문제를 일으킬 수 있다고 생각하니? –

관련 문제