我正在尝试创建一个文件操作器,所以当我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;
}
答案 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));
比你想做的更短更可读。