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>>そのため、何らかの方法でoperator をオーバーロードして の内容を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. コードを読もうとしている人にとっては、非常に混乱するでしょう。

次に、関数は 1 つのジョブを実行する必要があります (つまり、いくつかの異なるタスクを 1 つの関数にまとめて機能を隠そうとしないでください)。 istream入力ストリーム (この場合は、開きたいファイル名) からデータを読み取ります。ifstream実際にファイルを読み取るには、そのファイル名をインスタンスに渡す必要があります。おそらく、それを出力したいでしょう。その場合はostream(eg 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 に答える