这是我想要做的简化版本。如果我发布了整个东西,它将超过500行,所以我做了这个来测试东西,我得到了与大的相同的错误。
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
int main()
{
int node1, node2;
char *cmnd;
char *file;
int arr[1000], arr2[1000];
ifstream commands;
commands.open("commands.txt", ios::in);
if (!commands)
{
cerr<<"failed to open commands.txt"<<endl;
return 1;
}
cout<<"hello";
commands>>cmnd>>file;
cout<<"bye";
ifstream input;
input.open(file, ios::in);
if (!input)
{
cerr<<"failed to open input.txt"<<endl;
return 1;
}
int i = 0;
while(input.good())
{
input>>node1>>node2;
arr[i] = node1;
arr2[i] = node2;
i++;
}
commands>>cmnd;
while (!strcmp(cmnd, "WRITE_INDEX"))
{
commands>>node1>>node2;
if (strcmp(cmnd, "INSERT_LINK"))
{
arr[i] = node1;
arr2[i] = node2;
i++;
}
/*if (strcmp(cmnd, "DELETE_LINK"))
{
//find node 1 in main AVL tree
//delete node 2 from node 1 friends AVL tree
//if node 1 friend pointer is NULL
//delete node 1 from main AVL tree
}*/
commands>>cmnd;
}
commands>>file;
ofstream output;
output.open(file, ios::out);
if (!output)
{
cerr<<"failed to open output.txt"<<endl;
return 1;
}
while (i>0)
{
output<<arr[i]<<" "<<arr2[i]<<endl;
i--;
}
}
让我解释一下。 commands.txt是这样的:
READ_DATA input.txt
INSERT_LINK 1 2
INSERT_LINK 5 6
INSERT_LINK 6 7
WRITE_INDEX output.txt
但中间有更多插入或删除链接。它必须以READ_DATA开头,以WRITE_INDEX结束。
input.txt如下所示:
34 863
929 174
586 316
892 494
2列中的随机数。 我想在arr [1000]中保存左列,在arr2 [1000]中保存右列 然后在output.txt中反向打印它们。
当我在代码块中运行程序时它会崩溃,所以我添加了这些
cout<<hello
和
cout<<bye
在一个可疑区域,因为事实证明只有你好才能进入屏幕。这意味着程序崩溃了
commands>>cmnd>>file;
我无法找到代码的错误。任何帮助将不胜感激。
答案 0 :(得分:4)
这是写入内存中的随机位置:
commands>>cmnd>>file;
因为cmnd
(和file
)是未初始化的指针。使用std::string
代替char*
并立即检查IO操作的结果(不要使用while(input.good())
,请参阅Why is “while ( !feof (file) )” always wrong?了解原因):
std::string cmnd;
std::string file;
if (commands >> cmnd >> file)
{
}
==
operator is overloaded for std::string
所以strcmp
可以替换为:
if (cmnd == "WRITE_INDEX")
{
}
答案 1 :(得分:2)
你有:
char *cmnd;
char *file;
然后你这样做:
commands >> cmnd;
while (!strcmp(cmnd, "WRITE_INDEX"))
第一个命令无法使cmnd
未初始化,然后strcmp(cmnd, ...)
可能会崩溃。
将上述声明替换为:
std::string cmnd, file;