C ++中的流崩溃了程序

时间:2014-04-22 13:18:40

标签: c++ stream fstream cout

这是我想要做的简化版本。如果我发布了整个东西,它将超过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;

我无法找到代码的错误。任何帮助将不胜感激。

2 个答案:

答案 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;