1

私は次のものを持っています

^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 を削除しません。これを回避する最善の方法は何ですか。

4

2 に答える 2

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);
于 2012-05-10T09:53:49.313 に答える
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';
}

行を読んだ直後。これはテキストモードでも機能するはずです。

于 2012-05-10T10:16:00.597 に答える