2016-03-21 8 views
-2

こんにちは、私はここで新しく、c/C++でちょっと新しいですが、通常はストリームを練習しませんが、作成しようとすると、このコード私はいつも作成された.txtファイルに乱数、文字、記号、ごみを取得します。 このように: Hellothere.txtランダムな記号、数字を入力するのではなく文字を参照してください、それはよく表示されるので名前はOKですが、長い名前を書くとゴミ箱に書き込まれることがあります。ストリーム内の乱数、記号、文字C/C++


struct sample { 
     int code; 
     char name [20]; 
    } sampl; 

    int main() { 
     cout<<" ENTER CODE : "<<endl; 
     cin>>sampl.code; 

     cout<<" ENTER NAME :"<<endl; 
     gets(sampl.name); 

     fflush(stdin); 

     FILE *fp; 
     fp=fopen("Hellothere.txt", "rb+"); 

     if(fp==NULL) { 

      fp=fopen("Hellothere.txt","wb+"); 
      if(fp==NULL) { 
       puts("CANNOT OPEN"); 
       return 0; 
      } 
     } 

     fwrite(&sampl,sizeof(sampl),1,fp); 
     fclose(fp); 

     getchar(); 
    } 
+2

'fflush(stdin);' - それをしないでください。それは決して標準的ではありません。 'gets(sampl.name);'これをやってはいけません、 'gets'はあまりにも恐ろしいので、標準ライブラリから削除されました。あなたが設定していない 'name'のバイトとメモリ内の' int'の実装表現を含む、 'sample'オブジェクトの*全体の内容をあなたのファイルに書いていることを理解してください。あなたのコードは*フォーマットされた出力*を実行しません。だから、それから出てくるものはまさにあなたがしたことです。 'sample'のメモリ表現をディスクファイルにダンプします。 – WhozCraig

+0

私はあなたの答えを何度も読んだが、私はそれを100%で得ることはできなかったが、私はあなたを理解しているが、どうすればこの問題を解決できるだろうか? '' int code'を 'char code'私を修正してください。 –

+0

あなたは自分のコードを編集することができますか、それを解決するために何を書くべきか教えてください。 –

答えて

2

あなたが入力と出力のためのC++とCの古い施設を混合している:

はあなたが私は?、これを解決するために助けることができるここでは、コードです。 C++に固執すれば、はるかに簡単な時間を取ることができます。

まずは、C++と同等であなたの構造体を置き換えてみましょう:今すぐ

struct sample { 
    int code; 
    std::string name; 
}; 

nameは、必要な数の文字を保持することができます。

我々は今、関数を記述しますこれが出力されますC++出力ストリームにsample

std::ostream& write_sample(std::ostream& os, const sample& samp) 
{ 
    os << samp.code << "\n" << samp.name; 
    return os; 
} 

この意志の出力名を続けコード、それらの間で改行を持ちます。今

のは、構造体を埋めるためにC++の機能を使用するようにmain()ルーチンを変更してみましょう:右であるstd::coutとのwrite_sample()機能を使用することによって、我々はすぐに我々が物事を持っているかどうかを確認することができ、今

int main() 
{ 
    sample samp; 

    cout << "ENTER CODE :\n"; 
    cin >> samp.code; 

    cost << "ENTER NAME :\n"; 
    cin >> samp.name; 
} 

を出力ストリームのタイプ:

write_sample(std::cout, samp); 

これは、コンソールに入力した内容を繰り返す必要があります。

write_sample(outfile, samp); 

:我々は再び、この新しいストリームで私たちのwrite_sample()機能を使用することができ、今

std::ofstream outfile{"Hellothere.txt"}; 

ではなく、ファイルに書き込むには、我々はファイルストリームを開くには、C++の機能を使用することができますプログラムが実行されると、Hellothere.txtに入力したテキストが含まれているはずです。

最終(少し、より高度な)タッチとして、あなたは標準<<ストリーミングスタイルを使用できるようになる、operator<<にごwrite_sample()機能の名前を変更する場合があります

outfile << samp; 

一緒にすべてを入れて、最終的なコードは次のようになります:

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

struct sample { 
    int code; 
    std::string name; 
}; 

std::ostream& operator<<(std::ostream& os, const sample& samp) 
{ 
    return os << samp.code << "\n" << samp.name; 
} 

int main() 
{ 
    using namespace std; 

    sample samp; 

    cout << "Enter code:\n"; 
    cin >> samp.code; 

    cout << "Enter name:\n"; 
    cin >> samp.name; 

    std::ofstream outfile{"Hellothere.txt"}; 
    outfile << samp; 
} 
+0

私はあなたの答えを3回読んだが、今は完全に理解している。助けてくれてありがとう<3、ありがとう。 –

関連する問題