0

我正在尝试创建一个文件操纵器,因此当我cin >> filename读取文件并计算值时...当然我会添加更多内容,但我想继续获取文件内容的基础知识。

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

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

问题是代替接收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;
}
4

3 回答 3

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;
}
于 2012-11-13T08:53:06.080 回答
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");
于 2012-11-13T08:58:10.077 回答
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)); 

这比您尝试做的更短且更具可读性。

于 2012-11-14T00:56:19.150 回答