使用Visual Studio 2012&具有项目属性:
- 配置属性:常规:项目默认值:字符集:未设置
- 配置属性:C++:语言:将WChar_t视为内置类型:否
我使用了一个带有以下代码片段的ofstream:注意:路径"C:\data"对本示例有效
ofstream fexp;
fexp.open("c:datatest.txt", ios::out|ios::binary|ios::app);
fexp << "writing some text to file with append in binary" << endl;
fexp.flush();
fexp.close();
如果该文件不在目录中,则会打开该文件,写入文本等。如果该文件已经存在,则不会打开、不会写入该文件等。未发生异常,也未发现错误代码(在errno中)。在调试open()方法的内部时,我发现一些内部open调用试图将文件名字符串复制到wchar_t类型中,但退出时出现内部错误13(查找MS常量=Open Aborted)。
MBCS已经被弃用,所以我不想被设置为那样。唯一的另一个选择是Unicode,它中断了我一半的更改。为什么我不能使用std-io库??!!!
更奇怪的是,我有一些这样的工作,第二次切换到"否",第一次设置为MBCS。在处理诸如CEdit之类的GUI控件时,该代码在很多地方都能工作,如果必须的话,我有很多多余的代码要从CString转换为字符串。如果CString的表示本质上是一个const char*,它有点接近LPCTSTR(不完全)。从CString转换为字符串"应该"有点"SIMPLE"。这并不是因为UNECESARYUTF-8和UTF-16之间切换的复杂性。我希望我的字符是STRICTLY 1-BYTE。
最接近这种疯狂的途径是什么?我是否要回到MBCS(尽管已弃用)并更改例如,将GetWindowText()转换为GetWindowTextA(),或者放弃在Visual Studio中使用流,或者什么???
请告知,如果可以的话。。。如有任何帮助,我们将不胜感激。谢谢
Maddog
ps:当我的产品不会在亚洲或阿拉伯销售时,请不要麻烦地让我在代码中接受完整的Wide环境。
pps:最后一点,我之所以这么说是因为,我注意到我最初安装的VisualStudio2012默认为MBCS。
正如其他人所指出的,您的问题是由转义符引起的。
"c:datatest.txt"
应该是
"c:\data\test.txt"
你可以在这里找到更多关于转义序列的信息。
为了避免混淆,您可以在文件路径中使用/
而不是。
"C:/data/test.txt"
对于那些仍在关注这篇文章的人,两天半后,我确实弄清了发生了什么。很抱歉延迟发布这篇文章。事实上,我已经完全忘记了。
这是对父目录的访问权限的情况。不仅仅是经常否认。我的意思是特别拒绝打开要添加到其中的文件(使用追加打开)。除非您在文件或目录属性窗口的安全选项卡上进入高级模式,否则您甚至无法正常看到这些设置。即便如此,你也必须多走几步。因此,我的文件所在目录上方的目录设置了此设置(出于某种令人难以置信的原因)。不管怎样,我验证了三种方法(fopen()
、CFile.open()
、stream.open()
)目前均有效。
谢谢你的想法,我学到了很多以前不知道的东西。有些想法很棒。
Maddog