C++文件到C驱动

C++文件到C驱动,c++,windows,file,C++,Windows,File,我的程序允许用户指定写入文件的位置。如果指定C:\output.txt,则文件操作似乎不会成功,但不会创建文件。我知道这是因为Windows需要提升权限,当以管理员身份运行时,它确实会写入C:\。我的问题是,我如何才能检测到文件实际上没有打开 即使未实际创建文件,此块也会成功,不会出错: ofstream ofs; try { ofs.open(outputFile); if (!ofs.is_open()){ throw "The file could not

我的程序允许用户指定写入文件的位置。如果指定C:\output.txt,则文件操作似乎不会成功,但不会创建文件。我知道这是因为Windows需要提升权限,当以管理员身份运行时,它确实会写入C:\。我的问题是,我如何才能检测到文件实际上没有打开

即使未实际创建文件,此块也会成功,不会出错:

ofstream ofs;
try {
    ofs.open(outputFile);
    if (!ofs.is_open()){
        throw "The file could not be opened";
    }
    ofs << "it worked";
    ofs.close();
} catch (const char* ex){
    cout << ex;
    return 1;
}
如果open未能创建/打开文件,则流的is_open方法将返回false,并且流的failbit状态标志将被设置,因此fail方法和运算符!将返回true:

ofs.open(outputFile);
if (!ofs.is_open())
// or: if (ofs.fail())
// or: if (!ofs)
{
    cout << "The file could not be opened";
    return 1;
}

如果您没有创建文件的权限,“是否打开”应返回false。您确定该文件未创建,但仍将“是否打开”变为true吗?试试这个:if of s.rdstate&std::of stream::failbit!=打开0而不是ofs。如果找到正确的解决方案,请更新。尝试在文件名中使用正斜杠,例如C:/outfile。根据观察到的症状,TXT几乎可以肯定是VirtualStore重定向,因此您可能希望进一步强调答案的这一部分,并举些例子。这不是所问的问题,但是-我怎样才能检测到文件实际上没有打开?。我回答的第一部分解释了如何检查这一点。第二部分解释了如何创建文件,而不必位于OP预期的位置。与问题不同。他已经知道如何判断是否没有打开文件,所以回答这个问题是没有用的。解释没有打开文件和文件活动重定向到另一个路径并成功之间的区别使用sysinternals procmon我可以看到文件输出被重定向到C:\Users\{user}\AppData\Local\VirtualStore \-是否有方法确定文件的实际写入位置以通知用户?@koga73不使用ofstream,否。请改用,然后可以使用
ofstream ofs;
ofs.exceptions(ofstream::failbit);
try {
    ofs.open(outputFile);
    ofs << "it worked";
}
catch (std::ios_base::failure &) {
    cout << "The file could not be opened, or written to";
    return 1;
}
ofs.close();