【问题标题】:C++ get the size (in bytes) of EOLC++ 获取 EOL 的大小(以字节为单位)
【发布时间】:2016-04-08 23:11:24
【问题描述】:

我正在阅读一个 ASCII 文本文件。它由每个字段的大小(以字节为单位)定义。例如。每行包含 10 个字节用于某个字符串,8 个字节用于浮点值,5 个字节用于整数等等。

我的问题是读取换行符,它的大小取决于操作系统(我相信 Windows 通常为 2 个字节,Linux 为 1 个字节)。

如何在 C++ 中获取 EOL 字符的大小?

例如,在python中我可以这样做:

len(os.linesep)

【问题讨论】:

  • 如果您以文本模式打开文件,则换行符应始终为'\n',无论本机行结尾是什么。你真的需要知道原生 EOL 字符串的大小吗?
  • 文件是否保证保存在与您的代码运行所在的操作系统相同的操作系统下?如果是,只需以文本(非二进制)模式打开文件。

标签: c++ newline eol


【解决方案1】:

历史悠久的方法是阅读一行。

现在,最后一个字符应该是\n。剥掉它。然后,查看前一个字符。它将是\r 或其他东西。如果是\r,请剥离它。

对于 Windows [ascii] 文本文件,没有任何其他可能性。

即使文件是混合的(例如,有些行是\r\n,有些只是\n),这也有效。

您可以尝试在几行代码中执行此操作,以确保您没有处理一些奇怪的事情。

在那之后,您现在知道该文件的大部分内容会发生什么。但是,条带法是一般可靠的方法。在 Windows 上,您可以从 Unix 导入文件(反之亦然)。

【讨论】:

  • 有点吹毛求疵,但如果事先不知道行终止符是什么,就很难read a line。例如,您的配方对于 \r 行终止符以及保存为 \r\n\n\n 的连续空行都失败,这些行已在 windows-land 中看到。
  • @dxiv 该方法适用于\r\n\n\n(例如\r\n \n \n)——这只是我提到的混合模式[连续是非问题]。我已经有 20 多年没有见过 \r 唯一的文件了[如果有的话,我已经转换了 1000 个文件]。许多程序不可读,因为它们现在假定 [至少] 换行符。在一个上尝试 DOS type file ;-) 我认为甚至 MS 都不再支持它们了。 '\r' 在行的开头处有效[作为非终止符](例如,捕获的进度输出)。我已经看到了更多(例如\rpgm is 56% done\rpgm is 57% done
  • @CraigEstey - 老式 Mac 文件只有 \r。参见维基百科:en.wikipedia.org/wiki/Newline
  • @user3690202 我猜到了,但是,这超出了 OP 的问题范围。这样的文件需要在导入到 [NTFS] FS 时进行转换才能在 WinX 下使用——因此 OP 永远不会看到它们的原始文件。它们可以被自动检测/转换,但最好只“知道”[通过 cmd 行选项]。进行行读取的最快方法是通过mmap(请参阅我的答案:stackoverflow.com/questions/33616284/…),这很容易首先进行预扫描,但在 99.44% 的情况下几乎不值得付出额外的努力。
  • @CraigEstey - 我可以想到很多方法来获取 CR 终止的文本文件。您可以使用 linux 启动磁盘启动 windows 机器并从旧驱动器复制文件等。关键是 - OP 没有提到 windows,将文件复制到 windows 机器上不会“导入到 FS”,见鬼 Vim 可以生成如果您真的需要,可以在 Windows 机器上使用 CR 行结束文本文件。它似乎并没有“超出问题的范围”——事实上,它似乎是问题的全部意义,你错过了这一点。
【解决方案2】:

我不确定翻译是否发生在您认为的位置。看下面的代码:

ostringstream buf;
buf<< std::endl;
string s = buf.str();
int i = strlen(s.c_str());

在此之后,在 Windows 上运行,i == 1。因此 std 中的行尾定义为 1 个字符。正如其他人评论的那样,这是“\n”字符。

【讨论】:

  • 这段代码是错误的,因为 CRT lib 不会将 \n 转换为 \r\n 用于内存缓冲区,但它会用于文件和控制台。
  • 这里你展示了我面临的问题。 C++ 在写入文件/控制台时会将“\n”转换为操作系统特定的字符,而不是缓冲区。
  • @jramm 我认为您还没有很好地解释您的问题。 \n 在写入缓冲区时不需要(实际上也不能)进行任何编码。但是您将该缓冲区写入以文本模式打开的文件时,\n 将自动转换为平台要求的任何内容。然后,如果您以 text 模式打开同一个文件并将其读回,则换行符序列将被转换回\n。所以,至少对我来说,不清楚为什么你需要知道磁盘上文件中\n 的编码。
猜你喜欢
  • 2010-09-17
  • 2013-02-01
  • 1970-01-01
  • 2013-02-06
  • 1970-01-01
  • 2011-09-08
  • 2017-12-18
相关资源
最近更新 更多