Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何处理无效的异常处理程序例程?_C++_Exception_Visual C++ - Fatal编程技术网

C++ 如何处理无效的异常处理程序例程?

C++ 如何处理无效的异常处理程序例程?,c++,exception,visual-c++,C++,Exception,Visual C++,我正在建立一个程序,创建和删除目录。我使用MSVC编译器(Visual Studio 2017),这就是我不能分别使用“getcwd()”或“dirent.h”的原因。 我尝试了几种不同的方法来获取当前的工作目录,但总是出现问题。我设法用“_wgetcwd()”打印了cwd。然而,在我的研究中,我找不到如何将它的输出转换为在“\u rmdir()”或“\u wrmdir()”中使用它 我的主要目标是能够删除一个目录,而不必安装一些新的编译器。如果满足此条件,将非常感谢您的帮助,因为我已经尝试安装

我正在建立一个程序,创建和删除目录。我使用MSVC编译器(Visual Studio 2017),这就是我不能分别使用“getcwd()”或“dirent.h”的原因。 我尝试了几种不同的方法来获取当前的工作目录,但总是出现问题。我设法用“_wgetcwd()”打印了cwd。然而,在我的研究中,我找不到如何将它的输出转换为在“\u rmdir()”或“\u wrmdir()”中使用它

我的主要目标是能够删除一个目录,而不必安装一些新的编译器。如果满足此条件,将非常感谢您的帮助,因为我已经尝试安装其他编译器,但没有成功。我还尝试了不同的方法来获取cwd并将其转换为所需的数据类型,但在我的IDE范围和我的基本知识中,没有任何方法起作用

我几乎是一个编程初学者,我正在学习这本书,不幸的是它使用了“dirent.h”。下面是我当前代码的一个片段,我已经消除了所有错误。然而,我还是遇到了最后一个恼人的例外:

#include <iostream>
#include <stdlib.h>
#include<string>
#include <direct.h>

int main() {

    int t = 0;
    std::string str;
    char xy = ' ';
    char* _DstBuf = &xy;
    const char* uniquename;
    uniquename = _getdcwd(0, _DstBuf, _MAX_PATH);
    std::cout << "Current path is ";    
    while (*uniquename != '\0') // this pointer points to the beginning of my path
    {
        std::cout << char(*uniquename); //  prints one char of the path name for each iteration

        char var = char(*uniquename);

        str.push_back(var); //here the exception below is thrown.

        // jump to the next block of memory
        uniquename++;
    }
    std::cout << str <<'\n';

    const char* lastchance = str.c_str();

    if (_wchdir('..')) {
        std::cout << "changing directory failed.\n";
    }

    if (_rmdir(lastchance) == -1 && errno == ENOTEMPTY) { 
        std::cout << "Given path is not a directory, the directory is not empty, or the directory is either the current working directory or the root directory.\n";
    }
    else if (_rmdir(lastchance) == -1 && errno == ENOENT) 
    {
        std::cout << "Path is invalid.\n";
    }
    else if (_rmdir(lastchance) == -1 && errno == EACCES)
    {
        std::cout << "A program has an open handle to the directory.\n";
    }
    else if (_rmdir(lastchance)) {
        std::cout << "removing directory still not possible\n";
    }
#包括
#包括
#包括
#包括
int main(){
int t=0;
std::字符串str;
char xy='';
char*DstBuf=&xy;
常量字符*唯一名称;
uniquename=_getdcwd(0,DstBuf,_MAX_路径);

Std::CUT

所以如果你打算用C风格编程(即使你有C++编译器),你也必须学习数组和指针是如何工作的。它是“强”>远/强〉,要从因特网上学习太大的主题,你需要一个.< 不过,我会指出一些错误

char xy = ' ';
char* _DstBuf = &xy;
const char* uniquename;
uniquename = _getdcwd(0, _DstBuf, _MAX_PATH);
这是完全错误的。它可以编译,但这并不意味着它可以工作。这是必需的

char DstBuf[_MAX_PATH];
_getdcwd(0, DstBuf, _MAX_PATH);
_getdcwd需要一个作为指针传递的数组(请参阅,您需要了解数组和指针)

然后,您尝试打印结果并将结果分配给字符串。同样,代码比需要的复杂得多。下面是更简单的版本

std::string str = DstBuf;
std::cout << str <<'\n';
然后您尝试删除一个目录四次,很明显,删除一个目录不能超过一次

等等。

您的代码有几个问题。我认为您的异常是由这行代码引起的:

uniquename=_getdcwd(0,DstBuf,_MAX_路径);
它调用
\u getdcwd
并向其传递一个指向单个字符的指针,同时还指定指针最多可容纳
\u MAX\u PATH
。这是完全未定义的行为

修复这个问题,我认为你应该完全改变你正在做的事情。除了C++之类的分散的C++部分,你的代码读起来像是代码:STS::String 。因为C++ 17标准库支持内置的文件系统操作。因此,你可以用<代码> STD::文件系统< /代码>更简洁地重写代码。而且是安全的

../get path删除并存储在del_path中(del_path应该是std::filesystem::path对象)
std::filesystem::remove_目录(del_路径);//递归删除del_路径指定的目录
...
注意:
std::filesystem::remove_目录
如果失败,将抛出
std::filesystem::filesystem_错误

您可以使用
std::filesystem
通过
std::filesystem::current_path
获取当前目录


我也建议在C++上选择一个,因为这似乎并没有教你好的实践< /P>你是如何得出结论的?<代码> GETCWD()/<代码>是不是超出了你的范围,用那个编译器?那似乎不太可能。什么行引起异常,在什么条件下?(0,_DstBuf,_MAX_路径);

正在尝试将CWD的名称加载到单个字符变量
xy
。请参阅:
char*\u DstBuf=&xy;
您对
\u getdcwd
的参数不正确。您正在向单个字符传递指针,但告诉函数它最多可以在那里存储260个字符。一旦完成,所有赌注都将被取消接下来会发生什么。您可以传递NULL作为缓冲区参数,让它为您分配内存,或者传递已分配的大小适当的数组或内存块的地址。@nicomp:有一条注释,其中,异常会在代码示例中抛出。非常感谢!文件系统使它变得更容易了!
if (_chdir("..")) {
    std::cout << "changing directory failed.\n";
}