0

好的,所以我对 getline 有疑问。

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

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

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

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

因此,对于我的问题,他们是否无论如何都使用 getline 函数而不使用转义序列 \r?如果我不清楚,请告诉我。

4

2 回答 2

1

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

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

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

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

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

  • 二进制写入/文本读取
  • 以文本形式书写/以二进制形式阅读
  • 在 OS2 上写入文件和 OS1/读取文件
    • 其中 OS1/OS2 没有相同的线路终止顺序。

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

注意 2:以上假设您没有安装专门的本地设备来实现动态转换流数据的方面。

于 2010-03-21T09:32:47.893 回答
0

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

于 2010-03-21T03:47:12.743 回答