【问题标题】:C++ How do I properly use getline for ifstream membersC ++如何为ifstream成员正确使用getline
【发布时间】:2010-03-21 03:34:43
【问题描述】:

好的,我的 getline 有问题。

我有一个包含几个字符串的文件。我自己创建的,每个字符串都放在单独的一行上。

Ex. textfile.txt
    Line 1
    Line 2
    Line 3
    Line 4

//Little snip of code
    ifstream inFile("textfile.txt");
    getline(inFile, string1);

当我调试程序并要求它打印出 string1 时,它显示“Line 1\r”已保存到 string1。我知道这是我在创建文件时实际按 Enter 键的。此问题导致我的程序出现分段错误。我知道我的代码可以工作,因为如果我先使用 ofstream 写入文件,然后再读入,它就可以工作。

所以对于我的问题,他们是否仍然使用 getline 函数而不使用转义序列 \r?如果我不清楚,请告诉我。

【问题讨论】:

  • 这里没有足够的代码来确定问题可能是什么。
  • 我们能看到更大的代码示例吗?
  • 如果您在调试器中检查 sd::strings,字符串末尾很可能有“额外”字符 - 这是可以预料的,因为字符串的性质而不是错误,您需要在检查它们时考虑字符串的 size()。

标签: c++ ifstream getline


【解决方案1】:

您有 '\r' 字符这一事实本身不太可能导致段错误。

其他谜团:
如果您打开一个文件以写入二进制文件,则输出正是您输出的内容。
如果您打开一个文件以写入文本(默认),则输出是相同的,除了 '\n',它被转换为一个行终止序列(更多内容见下文)。

如果您打开文件以读取二进制文件,则输入就是文件中的内容。
如果您打开一个文件以读取文本(默认),则输入与文件相同,但行终止序列除外,它被转换为字符 '\n'。

在正常情况下这很好。但是每个平台似乎都有自己的线路终止顺序定义。因此,如果您在 MAC 上编写文本文件,然后在 PC 上读取它,它可能无法按预期工作。

因此,除非您执行以下操作之一,否则一切都应该有效。

  • 二进制写入/文本读取
  • 文本写入/二进制读取
  • 在 OS2 上写入文件和 OS1/读取文件
    • 其中 OS1/OS2 没有相同的行终止顺序。

注意 1:如果您以二进制模式写入文件。您不应该使用假定文本模式的 getline() (它期望行终止序列分割行)。子注意:对于那些迂腐的人,getline() 可能适用于二进制文件,但这可能依赖于实现细节,你不应该认为它是可移植的。

注意 2:以上假设您尚未安装实现动态转换流数据的构面的专用本地。

【讨论】:

    【解决方案2】:

    如果你的标准库被正确实现,终止字符应该从流中删除,但附加到字符串。即使它被附加到字符串中,也不应该导致段错误——我认为你的问题出在其他地方。

    【讨论】:

      猜你喜欢
      • 2014-11-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-09
      • 2012-08-21
      • 2014-02-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多