删除.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'; }
读完这条线后。 这也应该在文本模式下工作。