重载cin以取ifstream而不是char * fname?

时间:2012-11-12 20:27:45

标签: c++

我正在尝试创建一个文件操作器,所以当我cin >> filename它将读取文件并cout值...当然我会添加更多的东西,但我想继续获取基本的文件的内容。

我想要实现的是通过cout提示用户输入文本文件名,然后当他进入时,我将在下一行代码中再做一次cin >> readfile,然后编译器将运行操作符重载并输出内容。< / p>

我如何实现它。以下是我的代码。

问题不是接收char* fname,而是可以发送ifstream而不是

所以我可以做类似

的事情
ifstream infile(filename.c_str());
cin >> infile

以下是我当前的代码

#include <iostream>
#include <fstream>
#include <string>
#include "point2d.cpp"
#include "line2d.cpp"
#include <iomanip>

using namespace std;

struct myself
{
    string myname;
};

istream &operator>> (istream &stream, myself &myself )
{
    cout << "Enter my name";
    stream >> myself.myname;
    return stream;
}

istream &operator>> (istream &in, char* fname)
{
    ifstream inFile;
    inFile.open(fname);
    char ch1;
    while (inFile.get(ch1))
    {
        cout << ch1;
    }
}

int main()
{
    string filename;
    cout << "Enter file name: ";
    cin >> filename;

    // was thinking of
    // ifstream infile(filename.c_str());
    // then read infile with cin

    //how do i cin filename and read its content.     
    return 0;
}

3 个答案:

答案 0 :(得分:1)

你在这里弄乱了一些概念。你的问题太模糊了,我不相信你明白自己想做什么。

据我了解,你想要

cin >> istream;

要执行以下操作:

  • 读取文件名
  • 打开文件进行阅读
  • cin替换为文件的输入流

这是对的吗?

恕我直言,这是一个坏主意,因为约定cin >> 不应以任何重要方式修改cin 。当然,它会推进流,并且有一些黑客可以改变解析模式。

如果您使用新流替换流,请将此明显,请勿尝试将其隐藏在某些>>构造中。

编程不是拯救角色的运动。如果你让它变得更加神秘,你的程序将不会更快。优秀的程序员编写非常明确的代码的代码,以避免错误,并使其更容易找到它们。

istream* input = &cin; // Default input is stdin
*input >> filename; // read filename
input = new istream(filename, istream::in);
// Continue to use *input

// Clean up input, if you replaced it:
// You might want to use a boolean flag instead of this hack.
if (input != &cin) {
    delete input;
}

答案 1 :(得分:0)

我担心你在这里很困惑。 cin没有阅读任何内容;你从cin读到。因此,您可能希望以某种方式重载运算符>>以将cin的内容读入文件,但不是相反。

您可以做的是重载运算符<<,因此它将文件的内容输出到输出流,例如cout。但是,以下内容无效:

ostream& operator<<(ostream& out, char* filename);

您无法定义此运算符,因为它已经定义。您需要编写一个表示文件名的类,并在其上重载运算符。一个简单的版本:

struct Filename
{
  Filename(const string& filename) : filename_(filename) {}
  string filename_;
};

ostream& operator<<(ostream& out, const Filename& name)
{
  // read the file whose name is name.filename_
}

你可以这样称呼它:

cout << Filename("filename.ext");

答案 2 :(得分:0)

你正在做一些不好的做法。

首先,cin是一个istream,因此您希望重载istream运算符以获取istream。对于那些试图阅读你的代码的人来说,这将是令人难以置信的混乱。

其次,一个函数应该完成一个工作(也就是说,你不应该试图通过将几个不同的任务集中到一个函数来隐藏功能)。 istream从输入流中读取数据(在这种情况下,是您要打开的文件名)。然后,您需要将该文件名传递给ifstream实例以实际读取该文件。大概你想输出它,在这种情况下你会使用ostream(例如cout)。

您希望实现的整个逻辑可以在大约5行或更少的代码中完成:

string filename = "";
cin >> filename;
ifstream fin(filename.c_str(), ifstream::in);
copy(istreambuf_iterator<char>(fin), istreambuf_iterator<char>(), ostreambuf_iterator<char>(cout)); 

比你想做的更短更可读。