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

C 删除.txt文件中每行末尾的^M。,c,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

我有以下几点

^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 to the write=fopen”执行以下操作,但这两种操作都不会删除^M。解决此问题的最佳方法是什么。

您可以通过删除末尾的ay
\r
\n
字符来缩短字符串,例如更改:

  ...
  strcpy(linec, line);
  ...
致:

请注意,打印字符串时,需要添加换行符,例如使用

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';
}

在读了这行之后。这也应该在文本模式下工作。

Darn-有人打败了我。
strcpy(linec,line);len=strlen(linec);//获取字符串长度if(len>0&&linec[len-1]='\r')//如果最后一个字符是^M{linec[len 1]='\0';}fprintf(write,linec)
我现在正试图调试它。我在文件的顶部声明了int len;。它仍然给我相同的输出,但我认为它没有将^M作为最后一个字符,因为它会转到下一行。当我运行gdb时,我得到以下信息:`^XA\r\n`正如我在下面的回答中提到的,我认为这是不对的,因为它假定这行是真的ly仅以
\r
结尾,而实际上有一个
\r\n
对。@放松:谢谢-我现在更新了答案,因此从字符串末尾删除了所有
\r
\n
字符-希望这是一个更有用和通用的方法solution@user532339:立即更新答案-如果您没有更新,请尝试新版本我还没有找到工作solution@Fredrik我尝试了dos2unix,但告诉我安装一些东西。为我的回答干杯:)与其组装一个专用的C程序,不如
perl-pi-e的/\r\n/\n/g'[file2][…]
?使用strchr(buffer,'\n')和完整的文件作为缓冲区内容,并将^M替换为““'s?这将简单地删除它们,而忽略其余部分。你认为那会引起麻烦吗?
char *cr;

...

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