C ++ putback()成员函数

时间:2015-09-07 21:11:09

标签: c++

我只是有点困惑:成员函数putback()将读回的最后一个字符放回输入流。这究竟是什么意思?我尝试使用它进行实验,我注意到文件的结果没有区别,无论我是否使用putback()。

*我有两个文本文件:input.txt,内容为“5 2”,output.txt,操作前没有内容。

e.g

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
    char next;

    ifstream fin;
    ofstream fout;

    fin.open("input.txt");
    fout.open("output.txt");


    if((fin.fail())||(fout.fail()))
    {
        cout<<"File failed to open files";
        return 1;
    }

    while(next!='2')
    {
        fin.get(next);
        fout.put(next);
    }
    fin.putback(next);

    cout<<"This is next:"<<next;

    return 0;
}

2 个答案:

答案 0 :(得分:1)

putback将其参数放回输入流中,使其成为下一个要读取的字符。要查看它的工作原理,请将循环更改为以下内容并观察程序进入无限循环:

while (next != '2') {
    fin.get(next);
    fin.putback(next); // This will cause an infinite loop
    fout.put(next);
}

这是因为您阅读的第一个5将立即返回到输入流中,导致next永远不会变为2

答案 1 :(得分:0)

  

这究竟意味着什么?

我认为这意味着像

  • 文本文件的每个字符都驻留在&#39;在一个特定的位置指示器&#39;在文件中(您可能还阅读过&#39;文件偏移量&#39;)。

  • get()将当前&#39;位置的值的副本传输到您的变量(称为下一个),然后

  • 增加“#”位置&#39;指标(即模拟&#39;消费&#39;

请注意,有一个缓冲区与&if; ifstream fin&#39;相关联。 fin处理了许多我认为你不想担心的细节。例如,是什么原因导致(从当前&#39;位置&#39;)将一些文件内容从磁盘传输到缓冲区(fin),以便&#39; get()&#39;知道在哪里找到它。缓冲了多少文件?等

  • putback()减少&#39;位置&#39;指标,

虽然这可能对所有正在进行的事情的描述过于简单,但结果是文件没有变化。下一个get()将再次读取相同的char。

现在考虑用户代码放回前一个完整缓冲区的最后一个字符的测试用例;或用户代码放回最后n个字符读取的测试用例。很高兴它正在为你完成。

您的实验存在缺陷。我希望以上内容可以帮助您设计出更好的实验。

我建议你做一小部分get(),然后使用tellg查看每次获取或回放是否有变化。另外,尝试使用seekg。

希望这会有所帮助。