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。