C++ cli 仅打开某些文件扩展名并检查该文件的前两部分是否为整数

C++ cli 仅打开某些文件扩展名并检查该文件的前两部分是否为整数,c++-cli,file-extension,C++ Cli,File Extension,我正在编写的程序将以给定格式打开一个.DAT文件: 如何阻止用户打开.DAT以外的任何其他文件扩展名?例如,如果他们试图打开一个.PNG文件,它会抛出下面的MessageBox,指出它不是一个正确的迷宫文件 我还希望在文件的前两部分打开后都不是整数时发生这种情况 OpenFileDialog ^ fileDialog = gcnew OpenFileDialog(); fileDialog->InitialDirectory = "."; if (fileDialog->ShowDi

我正在编写的程序将以给定格式打开一个.DAT文件:

如何阻止用户打开.DAT以外的任何其他文件扩展名?例如,如果他们试图打开一个.PNG文件,它会抛出下面的MessageBox,指出它不是一个正确的迷宫文件

我还希望在文件的前两部分打开后都不是整数时发生这种情况

OpenFileDialog ^ fileDialog = gcnew OpenFileDialog();
fileDialog->InitialDirectory = ".";
if (fileDialog->ShowDialog() == ::DialogResult::OK)
{
   wchar_t fileName[1024];
   for (int i = 0; i < fileDialog->FileName->Length; i++)
      fileName[i] = fileDialog->FileName[i];
   fileName[fileDialog->FileName->Length] = '\0';

   ifstream ifs;
   ifs.open(fileName);
   maze = new Maze( mazePanel, ifs );
   ifs.close();
   if (maze->IsValid())
   {
      showOriginalBtn->Show();
      mazePanel->Show();
   }
   else
   {
      MessageBox::Show( "Not a proper maze file!" );
      mazePanel->Hide();
   }
}
下面是我在迷宫文件中读取并将其存储到正确位置的代码:

   valid = true;
   free = false;
   ifs >> width >> height;
   if ( width <= MAXSIZE && height <= MAXSIZE)
   {
      panel = drawingPanel;
      panel->Width = width * CELLSIZE;
      panel->Height = height * CELLSIZE;
   }
   else
      valid = false;

   char value;
   for (int i = 0; i < height; i++)
      for (int j = 0; j < width; j++)
      {
         ifs >> value;
         if (value != EXIT && value != DEADEND && value != OPEN)
         {
            valid = false;
            return;
         }
         orig[j][i] = value;
         solved[j][i] = value;
      }
您可以使用OpenFileDialog的Filter属性设置显示的扩展名。比如:

fileDialog->Filter = ".dat";
查找上次出现的“.”,下一个文本将是扩展名;将其与DAT进行比较

我不太明白你需要什么,所以我假设你的意思是你需要检查前两部分。在本例中,如果std::cin>>int1&&std::cin>>int2{/*…*/},则可以执行此操作。>>如果输入的格式与int1和int2的类型不匹配,将返回false

-编辑 回应您的评论,下面是您如何迭代wchar_t[]

    wchar_t t[] = { 'a', 'b', '.', 'D', 'A', 'T' };

    std::wstring s;

    for (int i = 5; t[i] != '.'; i--) {

        s = t[i] + s;

    }

    std::wcout << s << std::endl; //DAT

如果他们输入的是实际的名字呢?我需要打开程序以弹出消息框。使用System.IO中的Path.GetExtension方法检查DAT.1。使用wchar\u t数组让我感到困惑。我理解这个过程使用的是一个常规字符串,你能详细说明一下吗?2.这就是我的意思。非常感谢。很抱歉,我没有清楚地把这个问题讲清楚。事实上,我的第二个案例似乎也涵盖了我的第一个案例,因为输入PNG文件仍然会失败!对于第一个问题,我必须坐下来研究如何在使用wchar\u t时转换该方法。不过,我确实理解你所说的。据我所知,wchar\u t只是一种宽字符类型,宽含义是字符通常不只有1字节大。除了chars十六进制表示之外,遍历wchar_t数组应该与遍历chars数组相同。你应该从最后开始,向后移动,直到你找到一个新的目标。这是有意义的,而且肯定是我会在一个次要项目中研究的东西。再次感谢。不过,我们通常只说std::wstring t=Lab.DAT;。但是这个代码有更多的风格问题;例如不使用.findL.'和其他字符串方法。
    wchar_t t[] = { 'a', 'b', '.', 'D', 'A', 'T' };

    std::wstring s;

    for (int i = 5; t[i] != '.'; i--) {

        s = t[i] + s;

    }

    std::wcout << s << std::endl; //DAT