【问题标题】:_wfreopen works on c:/path/file.txt but not with c:\path\file.txt?_wfreopen 适用于 c:/path/file.txt 但不适用于 c:\path\file.txt?
【发布时间】:2011-01-03 23:57:45
【问题描述】:
TCHAR finalpath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,finalpath);
TCHAR filename[] = TEXT("\\lista.txt");
wcscat(finalpath,filename);
wprintf(L"List will be saved to %s", finalpath);

所以这基本上证实了我的 finalpath 确实是 c:\somepath\lista.txt

但是_wfreopen(TEXT(finalpath),TEXT("w"),stdout);

如果我把它改成

_wfreopen(TEXT("c:/somepath/lista.txt"),TEXT("w"),stdout);

然后一切正常,为什么以及如何让它接受我的 finalpath arg?

谢谢

【问题讨论】:

  • 我认为问题在于GetCurrentDirectory() 返回的路径没有被反斜杠终止。在添加 filename 字符串之前,您需要额外调用 wcscat() 来添加反斜杠。
  • @thkala:filename 中有一个前导反斜杠。另外,这个问题会出现在wprintf 输出中。
  • BTW:如果您希望代码在 ANSI 和 Unicode 下都可以工作,则需要为 _tcscat_tprintf_tfreopen
  • 你是否有机会为 POSIX 而不是 Win32 编译?
  • @Lambert:你的回答会是一个很好的评论,我会同意,尽管我觉得这不是解决方案。

标签: c++ c windows winapi string


【解决方案1】:

您不要将 TEXT 宏与变量一起使用。我很惊讶_wfreopen(TEXT(finalpath),TEXT("w"),stdout); 甚至可以编译。

试试_wfreopen(finalpath,TEXT("w"),stdout);

【讨论】:

  • 这个。如果 finalpath 是 TCHAR[] 类型,那么你不需要修改它。 TEXT 仅适用于文字。
  • finalpath 已经有正确的类型。 TEXT 宏没有效果,尽管使用错误。我认为你的回答没有帮助。
  • @user47249:你认为它没有效果的依据是什么?编译器仍会进行替换。作为参考,定义是#define __TEXT(quote) L##quote,所以它实际上变成了对名为Lfinalpath的变量的引用......它要么无法编译,要么意外地从其他地方拉入具有该名称的变量。
  • ...后跟#define TEXT(quote) __TEXT(quote)
  • 对不起上面的错误回复,我应该在这里发布,_wfreopen(finalpath,TEXT("w"),stdout);没有解决任何问题
猜你喜欢
  • 2020-03-19
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
  • 2016-08-17
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多