从Windows任务栏执行时ifstream问题
ifstream issue when executing from the Windows taskbar
我在64位Windows 7机器上在Visual Studio C 2012中写了一个非常简单的程序;它所做的就是使用std :: ifstream打开文件并打印其内容。
int main() {
std::ifstream fileStream("Test.txt");
if (!fileStream.is_open()) {
cerr<<"Error: "<<strerror(errno)<<endl;
} else {
std::string testString;
getline(fileStream, testString);
cout<<testString<<endl;
}
}
很简单,而且效果很好。在运行此代码时,在此代码生成的可执行文件的任务栏上显示了一个图标。如果您要右键单击该图标并运行由此产生的可执行文件的另一个实例,则ifstream将会失败,并指出该文件不存在。当然,除非它确实可以在正常执行下正确执行。
,如果以上不够奇怪,那么我试图将可执行文件固定到任务栏上并重复实验。它起作用。不管您从任务栏创建了多少个实例,如果将其固定起来。
使用完整的路径而不是相对的路径也有效,但是我正在开发一个较大的项目,该项目将资源相对于可执行文件而存储;我不想在文件已经就在那里时确定可执行文件的路径。
我确实调用了getModuleFilename查找执行路径,并且在所有执行中似乎都是相同的。
所以我的问题是,我想念什么?为什么我不能在我的可执行文件旁边的字面上找不到那些字面上的文件,如果它是这样运行的?
如何从任务栏重新启动您的应用程序可能是一个实现细节而不是记录。固定应用程序实际上是您个人资料中存储的快捷方式。如果这打破了您的应用程序,则如果用户使用.yourappapp.exe
!
相对路径相对于工作目录,而不是可执行文件中的目录。
可以通过多种方式设置新过程的工作目录:
- 它可以从父过程中继承
- 呼叫
CreateProcess
/ShellExecute
时,父进程可以设置特定目录 - 快捷方式(.lnk)可以指定工作目录
如果要与.exe在同一目录中打开文件,则应根据GetModuleFileName(0)
的结果构建完整的路径(PathRemoveFileSpec
和PathAppend
可能会有所帮助)。
如果您永远不会从命令行接受文件名,则可以在打开文件之前手动更改工作目录。
- 尝试使用 Ifstream 打开.txt文件时C++问题
- 使用 c++ ifstream 读取文本文件问题
- 将 istream 转换为 ifstream 时将 std::cin 传递到参数时出现问题
- 关于使用ifstream在C 中确定文件是否存在的问题
- 从Windows任务栏执行时ifstream问题
- 试图使用cmake打开ifstream的文件的问题
- 在 ifstream 上调用 clear() 有问题吗?
- C++:ifstream getline 问题交叉编译到 OpenWRT 发行版中
- 使用ifstream的模板函数有什么问题
- 将文件的常量字符* 地址传递给 ifstream 对象的问题
- 在C++中使用ifstream打开文本文件时遇到问题
- 读取文件(ifstream)和写入文件(ofstream)-编码问题
- 在 qt 中使用 ifstream 打开文件时出现问题
- 正确从 ifstream 获取值时出现问题
- 使用 ifstream 打开文件时遇到问题
- 在 C++ 中使用 ifstream 时遇到问题
- ifstream 对象的 .read() 问题 *char
- 我的ifstream方法出了什么问题
- C++ ifstream,加载时出现问题,";"
- 在IDE外运行时出现std::ifstream问题