删除.txt文件中每行末尾的^ M.

我有以下内容

^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 

我试图在每行的末尾删除^ M,并在C中有以下内容

 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*/ 

我尝试过将“rb +”,“r + b和rb写入write = fopen,但这两个都不会删除^ M.这是最好的方法。

您可以通过删除末尾的\n y或\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); 

你看到的^ M是一种表示回车(CR,0x0d)字符的方法。 接下来是换行符,这就是大多数Unix工具的结束。 此文本文件可能是由Windows程序编写的。

如果以二进制模式打开文件,则应该能够删除值为'\r'所有字符,这就是写入回车的方式。

Paul R的建议没有意识到'\n'跟在'\r' ,所以我认为它不会起作用。

但是,您可以执行以下操作:

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

读完这条线后。 这也应该在文本模式下工作。