【问题标题】:c++, reading string from file, segmentation faultC++,从文件中读取字符串,分段错误
【发布时间】: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*)&amp;rrr.size(),sizeof(rrr.size() )); -- size() 是成员函数,而不是变量。将size() 值保存在变量中并将该变量写入文件。
  • (char*)myString.c_str()std::string::c_str() returns a const *read() 需要一个非常量。

标签: c++ segmentation-fault access-violation


【解决方案1】:

我已经阅读了您的答案,在书中搜索并改变了阅读写作的整体观念 :) 现在,当我写作时,我使用:

int stringSize=text.length()*sizeof(char);
file.write(reinterpret_cast<char*>(&stringSize),sizeof(stringSize));
file.write(text.c_str(),stringSize);

当我阅读时,我会使用:

int stringSize=0;
string text;
plik.read(reinterpret_cast<char*>(&stringSize),sizeof(stringSize));
char * tempCharArray = new char[stringSize+1]{};
plik.read(tempCharArray,stringSize);
text=tempCharArray;
delete [] tempCharArray;

从那时起没有分段错误/访问冲突:) 正如奇普斯特指出的那样,我猜想“读入”(char*)myString.c_str() 是个问题。 谢谢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多