为什么我不能从ifstream获得输入?

时间:2014-11-06 19:10:45

标签: c++-cli ifstream

我正在尝试在迷宫程序的文本文件中阅读。输入类似于:

10 10
OO+E+OO+++
O++O+O+OOO
OOOOOO+O+O
+++++O++OO
OOO+OOO+O+
O+O+O+++O+
O+O+OOO+OO
++O+++O++O
O+OOOOO++O
O+O++O+OOO

当用户单击打开按钮时,将打开一个打开文件对话框

     {
        openFileDialog1->InitialDirectory = "C:\Desktop;";
        openFileDialog1->Filter = "Maze files (*.DAT)|*.DAT";

        if (openFileDialog1->ShowDialog() == ::DialogResult::OK)
        {
            char filename[1024];
            for (int i = 0; i < openFileDialog1->FileName->Length; i++)
            {
                filename[i] = openFileDialog1->FileName[i];
            }
            ifstream ifs;
            ifs.open(filename); // NULL terminate this
            maze = new Maze( panel1, ifs);
            ifs.close();
        }
     }

以下是迷宫构造函数

Maze::Maze( Panel ^ drawingPanel, ifstream & ifs )
{

    try
    {
        valid = false;
        ifs >> width >> height;
        int temp = width;
        drawingPanel->Size.Width = width;
        drawingPanel->Size.Height = height;

        for (int i = 0; i < height; i++) // height is always nothing
            for (int j = 0; j < width; j++)
            {
                if (orig[j][i] == DEADEND ||
                     orig[j][i] == OPEN ||
                     orig[j][i] == EXIT )
                    ifs >> orig[j][i];  // NULLS????
                else
                    throw 'D'; // i had to throw something....so i threw the D /* make a slit class and throw the D there? slit.fill(D); */
            }
        // this should be last
        panel = drawingPanel;
        valid = true;
    }
    catch (...)
    {
        valid = false;
        MessageBox::Show( "Not a proper maze file!" );
    }
}

程序运行时:ifs&gt;&gt;宽度&gt;&gt;高度宽度和高度未正确设置。

我在这个网站上搜索过这个问题,但却找不到任何有用的东西。对不起,我的经验不足,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

你的程序非常难看:不知道你是用C或C ++或C ++ / CLI编程,还是试着混合3 ...

因为你使用Windows Form projet,我会给你一个.Net解决方案来读取文件,这不是更好的解决方案,但这不会混合。

首先在第一个窗口上读取文件:

private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e)
{
    openFileDialog1->Filter = "Maze Files (*.dat) | *.dat";
    if (openFileDialog1->ShowDialog() == ::DialogResult::OK)
    {
        String ^fileName = openFileDialog1->FileName;
        IO::StreamReader ^myMazeFile = gcnew IO::StreamReader(fileName);
        String ^content = myMazeFile->ReadToEnd();
        richTextBox1->Text = content;
        myMazeFile->Close();
        // display button for open second form wich draw maze
        button2->Visible = true;
    }
}

现在我们有了文件内容,所以我们将它传递给第二个将绘制迷宫的表格:

private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e)
{
    String ^content = richTextBox1->Text;
    Maze ^frm = gcnew Maze(content);
    frm->Show();
}

第二个窗口,创建重载构造函数:

Maze(String ^contentMap)
{
    InitializeComponent();

    String ^dimension = getWords(contentMap, 2);
    array<String ^> ^coordsString = dimension->Split(gcnew array<Char> {' '});
    m_width = Convert::ToInt32(coordsString[0]);
    m_height = Convert::ToInt32(coordsString[1]);
    panel1->Width = m_width;
    panel1->Height = m_height;
}

getWords方法:

String ^getWords(String ^input, int numWords)
{
    try
    {
        int words = numWords;
        for (int i = 0; i < input->Length; ++i)
        {
            if (input[i] == ' ' ||input[i] == '\n')
                words--;
            if (words == 0)
            {
                return input->Substring(0, i);
            }
        }
    }
    catch (Exception ^ex)
    {
        // ...
    }
    return String::Empty;
}

你的维度是完整的.Net(私有成员m_width和m_height)。