バッファの 1 つには長すぎる質問または回答を入力していませんか? クラスの境界を超えて、スタックを破壊しています。また、cin と cout と、gets のような C スタイルの IO 関数を混在させると問題が発生するため、使用しないでください。
C++ を使用しているため、文字配列として文字列操作を行う必要はありません。すべてのメモリがらくたを処理する STL クラスがあります。クラスを次のように書き直します。
class Question
{ public:
string ques;
string option1, option2, option3, option4;
char k;
char quesno;
void write(fstream& f)
{
f << ques.length() << " " << ques << endl
<< option1.length() << " " << option1 << endl
<< option2.length() << " " << option2 << endl
<< option3.length() << " " << option3 << endl
<< option4.length() << " " << option4 << endl
<< k << " " << quesno << endl;
}
};
そしてあなたの機能は次のようになります:
void addques()
{
Question abc;
ofstream fout;
fout.open("question.txt", ios::app);
cout << "Enter Question!" << endl;
getline (cin, abc.ques);
cout << "Enter Options!\n";
getline(cin, abc.option1);
getline(cin, abc.option2);
getline(cin, abc.option3);
getline(cin, abc.option4);
cout << "Enter correct option number: ";
cin >> abc.k;
cout << "Enter question number: ";
cin >> abc.quesno;
// you will have to change your writing method a bit because you can't just write the string object straight to disk like you were before
abc.write(fout);
fout.close();
}
次に、抽出演算子を使用して、書き込みとほぼ同じ方法でストリームに読み込むことができるはずです。
アスキーからバイナリへ
バイナリを使用する必要があるため、次の方法で整数値をバイナリ値として格納できます。
int i = ques.length();
fout.write((const char *) &i, sizeof(i));
これにより、最初に文字列に変換せずに、32 ビット整数値がストリームに直接書き込まれます。文字列は次の形式になります。
+ 0x0 0x1 0x2 0x3 0x4 0x5 0x6 0x7
0x0 [0x00 0x00 0x00 0xC0 ][H E L L
0x8 O <space> W O R L D <null> ]
長さは最初の 4 バイトで、ここでは 0x0000000C (整数値 12) として示されています。文字列はすぐ後に続き、値は "HELLO WORLD\0" です。\0 はヌル ターミネータです。私の例では、この長さには null ターミネータが含まれています。
のサイズ
Sizeof は、指定された型のメモリ内のサイズを、コンパイラが決定できる最適なサイズで生成する演算子です。int、short、char などの整数型の場合、その型で使用されるバイト数が返されます。配列の場合、紛らわしい動作に遭遇する可能性があります。静的に宣言された固定サイズの配列に対して呼び出された場合、sizeof は配列の長さ * 1 つの要素のサイズを返します。
int derp[1000];
sizeof(derp); // sizeof(int) * 1000
コンパイラが配列の大きさを認識していない場合、得られるのは最初の要素へのポインタのサイズです。ので注意してください。ポインターで sizeof を使用して配列サイズを決定することはできません。
int derp2[];
sizeof(derp2); // sizeof(int *), probably 4 or 8
int * derp3 = derp;
sizeof(derp3); // sizeof(int *), probably 4 or 8
std::string (STL 文字列クラス) の長さを取得するには、length メンバーを使用します。
string hurr = "hello world";
hurr.length(); // does NOT include the null terminator
// length of string AND terminator is hurr.length() + 1