2010-12-06 13 views
0

現在、入力ファイルから名前を読み込もうとしています。ファイルは.datファイルです。C++ - NoobバイナリファイルIO質問

私が使用してデータを読み込むことができます。

student_struct s; 
    string fileName; 

    fstream inFile; 
    inFile.open(fileName, ios::in | ios::binary); 


    inFile.read(reinterpret_cast<char*>(&s),sizeof(Student)); 

これは、すべて正常に動作しますが...しかし、私はデータを読み込み使用する方法を知らない私は、これは非常に初心者の質問です実現します。しかし、私はちょうど入力ファイルからその名前を読み込み、それを別の文字列に格納したいと思っています。私はこれをどのようにして行うのですか?

+2

さて、あなたはそういう構造体を読み込めるかもしれませんが、おそらくそれは良い考えではないでしょう(例えば、ポインタがそのようなセーブ/ロードの後に​​使用できるようにならない、コンパイラのバージョンまたは構造体メンバが古い保存データを破損する可能性があります)。 –

答えて

2

このようにファイルを読み込むと、ポインタを一切持たない構造体に対してのみ機能します。単純な変数型です。つまり、そこにテーブルを格納することはできません(例えば、char *)。あなたの学生の構造がもっと複​​雑な場合は、ファイルがどのように組織されているかを示す何らかのプロトコルが必要です。たとえば、文字列サイズを含む1つまたは2つのバイトを使用できます。

のは、私たちは次のことを持っているとしましょう:

struct Student 
{ 
    std::string name; 
    int some_id; 
    std::string hair_color_description; 
}; 

今、私たちは

void saveToFile(Student s, fstream& f) 
{ 
    size_t strSize = s.name.size(); 
    f.write(reinterpret_cast<char*>(&strSize), sizeof(size_t)); 
    f.write(reinterpret_cast<char*>(s.name.data()), strSize); 
    f.write(reinterpret_cast<char*>(&s.some_id), sizeof(int)); 
    strSize = s.hair_color_description.size(); 
    f.write(reinterpret_cast<char*>(&strSize), sizeof(size_t)); 
    f.write(reinterpret_cast<char*>(s.hair_color_description.data()), strSize); 
} 

を行うことができます。もちろん

void loadFromFile(Student& s, fstream& f) 
{ 
    char *buffer = NULL; 
    size_t strSize; 
    f.read(reinterpret_cast<char*>(&strSize), sizeof(size_t)); 
    buffer = new char[strSize]; 
    f.read(buffer, strSize); 
    s.name = buffer; 
    delete[] buffer; 
    f.read(reinterpret_cast<char*>(&s.some_id), sizeof(int)); 
    f.read(reinterpret_cast<char*>(&strSize), sizeof(size_t)); 
    buffer = new char[strSize]; 
    f.read(buffer, strSize); 
    s.hair_color_description = buffer; 
    delete[] buffer; 
} 

をロードするためのファイルにこれを書きたいときこのコードには、I/Oアクションに対して常に実行されるエラー処理は含まれていません。

0

このコードに入る前にヘッダーファイルまたはどこかで定義したことを意味する構造体を使用するには、

それは、あなたが「S」にデータを格納しているし、あなたのように構造体を定義した場合の場合の場合:

student_struct 
{ 
    char firstname[FIRST_NAME_LEN]; 
    char lastname[LAST_NAME_LEN]; 
};

次に、あなたからそれを読んでいるので、あなたはs.firstname;s.lastnameを使用してアクセスしますファイルをwhileループを使用し、ファイルの終わりまで読み取ることができます。