2017-11-07 15 views
0

ファイル書き込みの概念を研究していました。最初に作業コードをコンパイルし、コードから理解することを考えました。しかしthisのコードは動作しません。実行するとアプリケーションがクラッシュします。私はinput.txtファイルを見て、それがテキストファイルであることを期待していましたが、最初の実行後の内容は "ØûrMichealÄØûrTerry l"です。オブジェクトをファイルに書き込むときにアプリケーションがクラッシュする

何が問題になりますか? 編集:

// C++ program to demonstrate read/write of class 
// objects in C++. 
#include <iostream> 
#include <fstream> 
using namespace std; 

// Class to define the properties 
class Contestant { 
public: 
    // Instance variables 
    string Name; 
    int Age, Ratings; 

    // Function declaration of input() to input info 
    int input(); 

    // Function declaration of output_highest_rated() to 
    // extract info from file Data Base 
    int output_highest_rated(); 
}; 

// Function definition of input() to input info 
int Contestant::input() 
{ 
    // Object to write in file 
    ofstream file_obj; 

    // Opening file in append mode 
    file_obj.open("Input.txt", ios::app); 

    // Object of class contestant to input data in file 
    Contestant obj; 

    // Feeding appropriate data in variables 
    string str = "Micheal"; 
    int age = 18, ratings = 2500; 

    // Assigning data into object 
    obj.Name = str; 
    obj.Age = age; 
    obj.Ratings = ratings; 

    // Writing the object's data in file 
    file_obj.write((char*)&obj, sizeof(obj)); 

    // Feeding appropriate data in variables 
    str = "Terry"; 
    age = 21; 
    ratings = 3200; 

    // Assigning data into object 
    obj.Name = str; 
    obj.Age = age; 
    obj.Ratings = ratings; 

    // Writing the object's data in file 
    file_obj.write((char*)&obj, sizeof(obj)); 

    return 0; 
} 

// Function definition of output_highest_rated() to 
// extract info from file Data Base 
int Contestant::output_highest_rated() 
{ 
    // Object to read from file 
    ifstream file_obj; 

    // Opening file in input mode 
    file_obj.open("Input.txt", ios::in); 

    // Object of class contestant to input data in file 
    Contestant obj; 

    // Reading from file into object "obj" 
    file_obj.read((char*)&obj, sizeof(obj)); 

    // max to store maximum ratings 
    int max = 0; 

    // Highest_rated stores the name of highest rated contestant 
    string Highest_rated; 

    // Checking till we have the feed 
    while (!file_obj.eof()) { 
     // Assigning max ratings 
     if (obj.Ratings > max) { 
      max = obj.Ratings; 
      Highest_rated = obj.Name; 
     } 

     // Checking further 
     file_obj.read((char*)&obj, sizeof(obj)); 
    } 

    // Output is the highest rated contestant 
    cout << Highest_rated; 
    return 0; 
} 

// Driver code 
int main() 
{ 
    // Creating object of the class 
    Contestant object; 

    // Inputting the data 
    object.input(); 

    // Extracting the max rated contestant 
    object.output_highest_rated(); 

    return 0; 
} 
+0

投稿コードとリンクはありません –

+2

そのコードは完全に壊れています。その作者が何も読んでいないと、彼らは何をしているのか分かりません。 [実際の本](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を入手してください - 安くて使い古された古いものでさえ、オンラインチュートリアルより優れています。見つける。 – molbdnilo

+0

そのウェブサイトのコードはひどい考えのようです。あなたは単にオブジェクトをそのようにシリアライズすることはできません。例えば。 'std :: string'は' char * 'へのポインタを含みます。コードは、そのポインタをファイルに書き込んだ後、それを読み込み、そこから 'std :: string'を再構築しようとします。しかし、この内部の 'std :: string'ポインタが指し示すメモリは決して割り当てられませんでした。そうでなければ、あなたは最高と未定義の動作でクラッシュします。 – Darhuuk

答えて

4

コードは基本的に壊れていると、あなたはそれを無視する必要があります。以下のコードです。

class Contestant { 
public: 
    // Instance variables 
    string Name; 
    int Age, Ratings; 

ので、Contestantstringを含むクラスです。

Contestant obj; 

そしてobjContestantです。

// Writing the object's data in file 
file_obj.write((char*)&obj, sizeof(obj)); 

お待ちください。ファイルにobjの実装で使用されたメモリコンテンツを書き出すだけです。それはまったく意味がありません。

ファイルはバイトのストリームです。ファイルに何かを書き込むには、それをわかりやすいバイトストリームに変換する必要があります。これは「シリアライゼーション」と呼ばれます。私たちの実装がメモリ内で何らかのデータを表現し、ファイルに書き込むために使用するデータを取ることはできません。メモリの他の領域へのポインタが含まれている場合はどうなりますか?

ファイルについて最も重要なことは、ファイルについて理解することです。ファイルを理解するためには、ファイルのストリームをバイトストリームとして定義する必要があります。これがファイル形式です。明らかに、そのコードの作者はそれを理解していません。このページで説明されている「理論」もこのような理由から間違っています。

関連する問題