您输入的问题或答案对您的某个缓冲区来说太长了吗?我敢打赌你是,它超出了班级的界限并破坏了堆栈。此外,混合 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();
}
然后,您应该能够以或多或少与 write 相同的方式使用提取运算符将其读入流中。
Ascii 转二进制
由于您必须使用二进制,您可以通过以下方式将整数值存储为二进制值:
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 是空终止符。在我的示例中,此长度包括空终止符。
大小
Sizeof 是一个运算符,它在编译器可以确定的情况下尽可能生成指定类型的内存大小。对于整数类型,例如 int、short、char 等,它将返回该类型使用的字节数。对于数组,您可能会遇到令人困惑的行为。如果在静态声明为固定大小的数组上调用,sizeof 将返回数组的长度 * 一个元素的大小。
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