C ++如何为ifstream成员正确使用getline

时间:2010-03-21 03:34:44

标签: c++ ifstream getline

好的,我的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中。据我所知,当我创建文件时,我实际上是在输入。此问题导致我的程序出现分段错误。我知道我的代码是有效的,因为如果我先使用ofstream来编写文件,然后我将其读入,那就可以了。

所以对于我的问题,他们无论如何使用getline函数而没有拿起转义序列\ r?如果我不清楚,请告诉我。

2 个答案:

答案 0 :(得分:1)

你拥有'\ r'字符的事实本身不太可能导致seg错误。

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

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

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

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

  • 二进制文字/文字阅读
  • 用文字书写/二进制阅读
  • 在OS2上编写文件和OS1 /读取文件
    • OS1 / OS2没有相同的线路终端序列。

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

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

答案 1 :(得分:0)

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