我有以下
^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执行以下操作:写入= fopen但这两种情况都不会删除^ M.这是解决此问题的最佳方法。
答案 0 :(得分: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);
答案 1 :(得分:1)
你看到的^ 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';
}
读完线后立即看到。这也应该在文本模式下工作。