使用向量和 fstream 的代码中的 Segfault 11? C++

Posted

技术标签:

【中文标题】使用向量和 fstream 的代码中的 Segfault 11? C++【英文标题】:Segfault 11 in code using vectors and fstream? C++ 【发布时间】:2012-04-25 22:37:11 【问题描述】:

我正在尝试编写一个程序,该程序将 txt 文件作为输入,并使用文本文件中单词中的 ques 来生成 .h 文件(希望以后再生成 .cpp 文件)。这段代码编译得很好,只是它在获取输入文件后会出现 11 段错误。有人可以帮帮我吗?

#include <iostream>
#include <fstream>
#include "12337756_Library.cpp"
#include <string>
#include <vector>

using namespace std;

int main()

    bool a;
    string filename;
    string line;
    vector<string> Attr;

    cout << "Enter input file name:";
    getline(cin, filename);

    ifstream fin(filename.c_str());

    if (fin)
    
        while(!fin.eof())
        
            getline(fin, line);
            createNewFile(line);
            Attr.push_back(line); 
        
        if(Attr[1]=="Movie.h")
        
            bool x,y;
            //x=createNewFile(Attr[0]);
            y=createNewFile(Attr[1]);
            if(x)
            
                ofstream fout(Attr[1].c_str());
                fout << "#ifndef HEADER_H_" << endl << "#define HEADER_H_" << endl;
                fout << "#include <iostream>" << endl << "#include <vector>" << endl;
                fout << "using namespace std;" << endl;
                fout << "enum Movie_Rating G,PG,PG13,R,NC17,NR ;" << endl;
                fout << endl << endl << endl;
                fout << "class Movie" << endl << ""<< endl;
                fout << "public: " << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << "// ----- Constructors -----------------------------------" << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << endl << "Movie();" << endl << "Movie(const string& title);" << endl;
                fout << "Movie(const string& title, const string& director, Movie_Rating rating,unsigned int year,const string& path,const string& actor); " << endl;
                fout << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << "// ----- Destructor -------------------------------------" << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << endl;
                fout << "~Movie();" << endl << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << "// ----- Inspectors -------------------------------------" << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << endl;
                fout << "string getTitle() const;" << endl;
                fout << "string getDirector() const;" << endl;
                fout << "Movie_Rating getRating() const ;" << endl;
                fout << "unsigned int getYear() const ;" << endl;
                fout << "string getURL() const ;" << endl;
                fout << "string getActor(unsigned int i) const ;" << endl;
                fout << "int getActorNumber() const ;" << endl;
                fout << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << "// ----- Mutators ---------------------------------------" << endl;
                fout << "// ------------------------------------------------------" << endl;
                fout << endl;
                fout << "void setTitle(const string& title);" << endl;
                fout << "void setDirector(const string& director) ;" << endl;
                fout << "void setRating(Movie_Rating rating)  ;" << endl;
                fout << "void setYear(unsigned int year)  ;" << endl;
                fout << "void setURL(const string& path)  ;" << endl;
                fout << "void setActor(const string& actor);" << endl;
                fout << endl;
                fout << "//-----------------------------------------------------------" << endl;
                fout << "//------- Facilitators --------------------------------------" << endl;
                fout << "//-----------------------------------------------------------" << endl;
                fout << "void output(ostream & out);" << endl;
                fout <<"// ----------------------------------------------------------" << endl;
                fout <<"// ----------------------------------------------------------" << endl;
                int size = Attr.size();

                while(size!= 1)
                
                    fout << Attr[size] << endl;
                    size--;
                
                fout << ";" << endl;
            
        
    

【问题讨论】:

while(!fin.eof()),最流行的现代 C++ 反模式。 这看起来很可疑:#include "12337756_Library.cpp"。同样,if(x) 从未初始化过 bool x 显然是不可靠的。 在段错误发生时,您的调试器说什么位于堆栈顶部?如果是createNewFile(),我们帮不了你。 是段错误还是超出范围错误?如果只有一个文件,则Attr[1] 不存在(只有Attr[0] 存在)。 @StackUnderflow : std::vector&lt;&gt;::operator[] 不会抛出超出范围的错误。充其量,这可能是一个断言。 【参考方案1】:

您只推回了一个 std::string,因此您的向量仅包含 1 个元素。要访问该元素,请使用 Attr[0] 而不是 Attr[1](在代码中有几个地方可以这样做)。请记住,在 C++ 中,索引从 0 开始,而不是 1

另外,在以下代码中,size() 返回1,因此永远不会进入 while 循环。

int size = Attr.size();

while(size!= 1)

    fout << Attr[size] << endl;
    size--;

【讨论】:

如果 size() 返回 1 你永远不会进入循环吗? 虽然我同意向量访问被关闭了。 @Jesse 很好,谢谢,帮助很大,还有一些其他错误,但段错误消失了!

以上是关于使用向量和 fstream 的代码中的 Segfault 11? C++的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中读取文件并将文件中的数据插入到类类型的向量中?

如何将对象存储在向量中的对象中? (C++)

不计算程序中的最低和最高成绩。 (c++) (fstream)

将矩阵加载到 2D 向量 C++

C++标准I/O库:iostream, fstream, sstringstream

如果该结构的另一个成员已知,则在向量中修改该结构的成员