C++ 读取文件时检测到堆栈崩溃

C++ 读取文件时检测到堆栈崩溃,c++,C++,我制作了一种从input.txt文件读取数据的方法 这是密码 void readData() { ifstream myfile; myfile.open("input.txt"); char v[1], w[1]; while (myfile.good()) { string line; getline(myfile, line, ' '); strcpy(v, line.c_str());

我制作了一种从
input.txt
文件读取数据的方法 这是密码

void readData()
{
    ifstream myfile;
    myfile.open("input.txt");
    char v[1], w[1];
    while (myfile.good())
    {
        string line;
        getline(myfile, line, ' ');
        strcpy(v, line.c_str());
        getline(myfile, line);
        strcpy(w, line.c_str());
        //graph->addEdge(v[0], w[0]);
    }
    myfile.close();
}
我试图从输入文件中获取两个顶点,其中一行包含两个字符。在我的
Graph
类中,我做了一个
addEdge
方法,它以两个字符作为输入,将其添加到Graph中

这是我的input.txt文件

A B
A C
F D
D C
U I
U D
B I
F B
但当我运行程序时,它给出了错误

*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)
***检测到堆栈崩溃***:终止
中止(堆芯转储)
我不明白为什么会发生这个错误。我已经阅读了有关stackoverflow此错误的其他问题。但他们在读取文件时都没有出错

如果我删除strcpy(w,line.c_str())行,我还想添加一件事那么代码正在工作,可能是这一行导致了错误。我对此不确定。 请帮我解决这个错误。
提前谢谢

直接的问题是一个单字符C样式字符串占用两个字节:字符和NUL终止符。所以你的数组太短,你写的东西超出了它们的界限

但是,您根本不需要数组。您可以只存储适当的字符:

void readData()
{
    ifstream myfile;
    myfile.open("input.txt");
    while (myfile.good())
    {
        string line;
        getline(myfile, line, ' ');
        char v = line[0];
        getline(myfile, line);
        char w = line[0];
        graph->addEdge(v, w);
    }
}
还要注意,不需要显式地
关闭文件。它的析构函数会为你做的很好


请注意,上面的代码不进行任何错误检查。在生产代码中,您应该始终测试输入操作的结果(例如
getline
调用)是否成功。最简单的解决方案如下所示:

void readData()
{
    ifstream myfile;
    myfile.open("input.txt");
    while (myfile.good())
    {
        string line;
        if (!getline(myfile, line, ' ') || line.empty())
            break;
        char v = line[0];
        if (!getline(myfile, line) || line.empty())
            break;
        char w = line[0];
        graph->addEdge(v, w);
    }
}

空终止。您希望strcpy(w,line.c_str())是什么要做什么?你有不是空的行吗?这些应如何装入
w
?如果你是C++,为什么不使用<代码> STD:String < /Cord>代替C风格字符串?你读过这个问题吗?虽然语言不同,原因相同,但您应该能够自己解决问题。声明
char v[1]
v
是一个可以容纳零个字符的字符串,加上一个终止
nul
字符。大小为1的数组是毫无意义的。想想看。在访问字符串的第一个字符之前,是否值得检查该字符串是否为空?我有一个问题
,请注意,没有必要显式关闭该文件。它的析构函数可以很好地为您执行此操作。
您正在谈论哪个析构函数??我不擅长C++。@ absHekPaull的析构函数<代码> STD::IFSturi。