2016-03-28 42 views
-3

私はユーザにユーザ名パスワードを入力してからdat fileに保存するように求めるプログラムを書いています。その後、ユーザー名とパスワードを出力するはずですが、ちょうど0x9ffd18のような16進数を返します。ここでのコードは、あなたがファイルにinputedデータを印刷しない16進数を表示せずにdatファイルからテキストを読み取る方法は? C++

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
fstream myfile; 
myfile.open ("password.dat"); 
string username; 
string password; 
cout << "This is being saved to a file" << endl; 
cout << "Please enter your username" << endl; 
getline (cin, username); 
myfile << username; 
cout << "Please enter your password" << endl; 
getline (cin, password); 
myfile << password; 
cout << myfile << endl; 
} 

答えて

-1

ですが、std::fstreamオブジェクトがアドレスに変換しました。これを修正するには、rdbuf()メソッドを使用します。

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    fstream myfile; 
    myfile.open ("password.dat"); //open for input 
    string username; 
    string password; 
    cout << "This is being saved to a file" << endl; 
    getline (cin, username); 
    myfile << username; //input first string 
    cout << "Please enter your password" << endl; 
    getline (cin, password); 
    myfile << password; //input second string 
    myfile.close(); //close so data is sent from buffer 
    myfile.open("password.dat"); //open for output 
    cout << "Your file: " << myfile.rdbuf() << endl; //print all characterf from file 
    myfile.close(); 

} 
+1

を、そうではありません ' fstream'アドレスが出力されますが、 'operator void *'の出力は 'fail()'がtrueを返す場合はnullポインタ、そうでない場合はその他の未定義値を返します。 –

+0

@Metteo Italia:yeah、true – xinaiz

2
cout << myfile << endl; 

あなたのファイルへの書き込みが、デフォルトで進値として印刷されmyfileのアドレス、のvoid*解釈されてきたものを出力しません。

ファイルを閉じるか(またはseekg()を開始位置に)、再度開いて、書き込まれた値を読み取る必要があります。

+0

いいえ、最初にmyfile.seekgを実行し、変数に "myfile >>"を実行して、この値を表示します。 –

0

問題を解決するための私の提案は:

#include <iostream> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    fstream myfile; 
    myfile.open ("password.dat", ios::in | ios::out | ios::trunc); 
    string username; 
    string password; 
    cout << "This is being saved to a file" << endl; 
    cout << "Please enter your username" << endl; 
    getline (cin, username); 
    myfile << username; 
    cout << "Please enter your password" << endl; 
    getline (cin, password); 
    myfile << password; 
    char data[100]; 
    myfile.seekg(0,ios::beg); 
    myfile >> data; 
    cout << "Output: " << endl; 
    cout << data << endl; 
    myfile.close(); 
} 
0

あなたがここでの問題のカップルを持っています。 1つは、ファイルを巻き戻して内容を読み取る単純な行為です。もう1つ(おそらくもっと重要なのは、少なくとも長期的には)ファイルを明白に読み戻せる方法でファイルを書き込むことです。

今のところ問題は、ユーザー名とパスワードを書いて、どこが終了し、どこが始まるかを定義することがないことです。最も明白な候補は改行です。両方とも、getlineを使って読むと、改行で読み込みを停止するので、どちらも改行を含むことはできません。

それ以外

、私はあなたがstd::stringを使用しているので、#include <string>をいただきたい、とusing namespace std;を取り除くとendl S(ほぼ必ずミス)を取得します。結果はこのようになります:

#include <iostream> 
#include <fstream> 
#include <string> 

int main() { 
    std::fstream myfile("password.dat", std::ios::in | std::ios::out | std::ios::trunc); 

    std::string username; 
    std::string password; 
    std::cout << "Please enter your username: "; 
    std::getline(std::cin, username); 
    myfile << username << '\n'; 
    std::cout << "\nPlease enter your password: "; 
    std::getline(std::cin, password); 
    myfile << password; 

    myfile.seekg(0); 

    std::string read_back_user_name; 
    std::string read_back_password; 

    std::getline(myfile, read_back_user_name); 
    std::getline(myfile, read_back_password); 

    std::cout << "The user name is: " << read_back_user_name << "\n"; 
    std::cout << "The password is: " << read_back_password << "\n"; 
} 

あなたは本当にただcoutにファイルの内容全体をコピーしたい場合は、あなたがこのような何か行うことができます:実際に

myfile.seekg(0); 

    cout << myfile.rdbuf(); 
関連する問題