【发布时间】:2020-05-21 20:37:18
【问题描述】:
我遇到了分段错误,我不知道出了什么问题。 一年多以前,我写了一个程序,它应该写在我的课程中包含的硬盘字符串、整数和双精度数上。
我一直在使用这段代码:
class Ttimes {
public:
string name;
};
class R {
public:
string name;
vector<Ttimes> ttt;
};
vector<R> rrr;
// while writing:
string file_name("C:\\abc\\example.ttt");
fstream f;
f.open(file_name.c_str(), ios::out | ios::binary);
if (f) {
f.write((char *)&rrr.size(), sizeof(rrr.size()));
for (int i = 0; i < rrr.size(); i++) {
myString = rrr[i].name;
int stringSize = myString.size();
f.write((char *)&stringSize, sizeof(stringSize));
f.write(myString.c_str(), myString.size());
f.write((char *)&rrr[i].ttt.size(), sizeof(rrr[i].ttt.size()));
for (int j = 0; j < rrr[i].ttt.size(); j++) {
myString2 = rrr[i].ttt[j].name;
int stringSize2 = myString2.size();
f.write((char *)&stringSize2, sizeof(stringSize2));
f.write(myString2.c_str(), myString2.size());
} // end for j
} // end for i
f.close();
} // end if f
// while reading:
rrr.clear()
string file_name("C:\\abc\\example.ttt");
fstream f;
f.open(file_name.c_str(), ios::in | ios::binary);
if (f) {
int howManyR;
f.read((char *)&howManyR, sizeof(howManyR));
for (int i = 0; i < howManyR; i++) {
R empty;
RRR.push_back(empty);
int stringSize;
string myString;
f.read((char *)&stringSize, sizeof(stringSize));
myString.resize(stringSize);
f.read((char *)myString.c_str(), stringSize);
rrr[i].name = myString;
rrr[i].ttt.clear();
Ttimes emptyT;
int vectorTTTsize;
r.read((char *)&vectorTTTsize, sizeof(vectorTTTsize));
for (int j = 0; j < vectorTTTsize; j++) {
rrr[i].ttt.push_back(emptyT);
string myString2;
int stringSize2;
f.read((char *)&stringSize2, sizeof(stringSize2));
myString2.resize(stringSize2);
f.read((char *)myString2.c_str(), stringSize2);
rrr[i].ttt[j].name = myString2;
} // end for j
} // end for i
f.close();
}
一切正常(一年中的 1.5 年!)但几天前我开发了代码 - 我添加了另一个向量 R 并复制粘贴相同的读写代码。从那以后,我不时遇到分段错误。当我尝试使用调试器时 - 它永远不会显示同一行:/我是自学成才的初学者,并且为自己编程,所以请怜悯;)
【问题讨论】:
-
一个问题是你写了一个
size_t,但读回了一个int,这里是int howManyR;。不保证大小相同。 -
f.write((char*)&rrr.size(),sizeof(rrr.size() ));--size()是成员函数,而不是变量。将size()值保存在变量中并将该变量写入文件。 -
(char*)myString.c_str()std::string::c_str()returns aconst *。read()需要一个非常量。
标签: c++ segmentation-fault access-violation