指定绝对路径时无法打开 fstream

4

我知道这可能有点可笑,但是我似乎无法让简单的C++ ofstream代码正常工作。你能告诉我以下代码可能出了什么问题吗:

    #include <fstream>

    ...

    ofstream File("C:\temp.txt");

    if(File)
       File << "lolwtf";

无论我指定什么绝对路径,都无法打开 ofstream。相对路径似乎没有任何问题。我真的不确定这里问题出在哪里。

2
哦,显然'C:'不被接受为有效路径。这真是不幸,因为我正在尝试写入由TEMP环境变量指定的路径。有什么建议吗? - ModeEngage
1
如果你的意思是它在std::中。你需要让我们知道你所说的“它不起作用”是什么意思。编译错误?运行时错误?输出错误? - GManNickG
抱歉。主要问题在于当我指定包含驱动器号的绝对路径时,它拒绝打开文件。原始问题将很快更新。 - ModeEngage
正如其他人所指出的那样,问题在于转义反斜杠。但是你是否应该假设环境变量TEMP指向哪里呢?使用Win32 API GetTempPath()或GetTempFileName()会更安全。 - Steve Folly
顺便提一下,这个问题在C++ FAQ Lite中有涉及 http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.16 我鼓励你阅读整个FAQ,你会学到很多东西。 - robson3.14
3个回答

29
您的路径无效:
"C:\temp.txt"
\作为转义字符,将"t"解释为水平制表符,因此路径的值最终变成:
"C:    emp.txt"

您需要的是:

"C:\\temp.txt"

或者

"C:/temp.txt"

我在脚本语言中经常犯这个错误,它会返回并显示无效路径“blah”,转义字符会立即消失,让我意识到错误。 - whatnick
1
这是问题所在。我试图获取Windows环境变量PATH,但返回的结果中包含未转义的斜杠。谢谢! - ModeEngage

8

问题出在您的字符串中,您没有转义反斜杠。

 ofstream File("C:\\temp.txt");

3
@Ed: "File"不是一个指针,而是从basic_ios派生的流对象具有一个void*()运算符。如果fail()返回true,则返回空指针,否则返回一些非空指针。这就是'if(File)'的工作原理。(但你说的关于必须转义反斜杠的是对的。) - Steve Folly
1
啊,好的,谢谢。在我发帖之前,我应该确认一下这个问题。 - Ed S.

8
尽管Windows用户似乎更喜欢使用非标准的“\”字符作为路径分隔符,但标准的“/”完美地工作,并避免了像这样的烦人问题。
因此,我的建议是坚持使用正斜杠...
std::ofstream File("C:/temp.txt");

非标准的?我不知道路径分隔符已经被标准化了。 - Ed S.
3
今天常用的平台中,如果要命名一个不支持'/'作为路径分隔符的平台,也许是VMS? - alex tingle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接