【问题标题】:Adding \x0D \x0A to end of record将 \x0D \x0A 添加到记录末尾
【发布时间】:2014-06-17 20:32:35
【问题描述】:

我正在编写一个 Perl 程序来添加 \r \n 作为 200 字节记录末尾的第 201 和第 202 字节。我正在尝试这样做:

use constant REPORT_LINE_LEN => 200;

while(($rc = read $infile, $report_line, REPORT_LINE_LEN(), 0) != 0)
{
    chomp $report_line;
    $report_line .= "\r\n" . "\n";
    print $outfile $report_line;
}

回车 ^M 字符位于位置 201,我需要在 202 处有一个 \n,但如果不将记录的长度增加超过 202 个字节,似乎无法将其放置在那里。我正在用 vim 验证 ^M 的位置,这表明文件仍然是 Unix 格式。

我已经搜索了很多资源,并且很难过。任何帮助将不胜感激,包括最后两个字节在 vim 中的显示方式。

我正在 vim 中通过按“$”来确认记录长度以到达行尾。现在,它显示 201。我还使用head -n 1 rmvtape.out | wc -c 来确认记录的长度,其中rmvtape.out 是包含这些记录的文件。长度为202。

那么,在这种情况下,^M 在 vi​​m 中是不可见的吗?

【问题讨论】:

  • 确保您的输出文件使用的是binmode。那么只需执行“\r\n”就足够了。
  • 您能否详细说明您是如何检查记录长度的?另外,“超过 202 字节”是多长时间?
  • @Mr.Llama 刚刚编辑了带有答案的文件。
  • 试试head -c 202 rmvtape.out | od -ax。这将为您提供该行的十六进制转储,这将帮助您解决长度问题。请注意,我使用的是head -c 202,因为head -n 1 将拆分第一个\n,这在技术上是记录的一部分。

标签: perl vim file-format


【解决方案1】:

$report_line .= "\r\n" 。 "\n";

您要在此处添加三个字符,例如 \r、\n 和另一个 \n。 省略最后一个\n,一切都应该没问题,例如:

$report_line .= "\r\n";

【讨论】:

  • @Steffen_Ulrich 我试过这个,但 vim 中的位置计数回到 200,并且 vim 中缺少 ^M。类型仍然是 unix。
  • 尝试warn unpack("H*",$report_line) 查看真正在行中的八位位组并使用length($report_line) 检查长度。如果这些给出正确的值,那么$output 就是你的问题,例如像@Miller建议的那样使用binmode。并且不要相信 vim,使用 hexdump 看看到底有什么。
  • @Steffen_Ulrich 您的方法产生 202 个字节。用 hexdump 确认。
  • 感谢您的回答和 cmets。这基本上是在告诉我最初的想法,这些是记录终结者,实际上并不是记录的一部分。
  • 如果 ^M 出现在输出中,但在 Vim 中缺失,那么 Vim 可能实际上将文件检测为 dos 格式。当加载此文件时,您确定 Vim 的 'fileformat' 值实际上停留在“unix”吗?如果每一行都以 \r\n 结尾,那么 Vim 默认会以 DOS 格式加载它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2012-07-12
  • 2013-08-07
相关资源
最近更新 更多