【问题标题】:Open file to display content in C++在 C++ 中打开文件以显示内容
【发布时间】:2012-02-11 20:42:53
【问题描述】:

关于使用 C++ 打开文件(任何类型的文件),我有 2 个问题要问。我目前正在开发一个 GUI 程序,我想添加一个 txt 格式的变更日志。此外,我希望我的程序中的一个菜单可以使用每个用户安装的默认文本编辑器打开那个 changelog.txt,或者简单地把它打开来打开那个文本文件。请记住,我想在程序中打开文件以显示 NOT 以进行输入/输出。我知道我可以使用

system("notepad.exe filepath.txt");

或者用预设程序打开它们:

system("filepath.txt");

问题是它们都在记事本后面打开了一个命令行。我知道还有另一个命令可以使用名为 CreateProccess() 的 Win32 API 打开文件,但我的编译器无法识别该命令(OpenWatcom W32)。 所以这是我的问题:

1) 使用system命令时是否有其他打开文件的命令或有办法阻止命令行打开?

2) 如何在 Windows 中定义文本文件在当前程序文件夹中?我的意思是,有没有办法“告诉”程序该文件始终位于程序所在的当前文件夹中,而不是给出将在用户之间更改的整个文件路径?

对于任何错误,我深表歉意,如果您需要任何澄清,请告诉我。

【问题讨论】:

    标签: c++ windows winapi user-interface file-io


    【解决方案1】:

    CreateProcess 在这里使用的函数是错误的。这将需要您决定运行哪个进程。用户可能更喜欢使用记事本以外的文本编辑器,我知道我愿意!在 Windows 上执行此操作的正确方法是要求 shell 使用用户与文件关联的任何程序打开文件。 ShellExecute 函数就是这样做的。

    这样称呼它:

    ShellExecute(
        MainWindowHandle,
        "open",
        FullyQualifiedTextFileName,
        NULL,
        NULL,
        SW_SHOWNORMAL
    );
    

    您需要包含 Shellapi.h 头文件并链接到 Shell32.lib 库。如果您的编译器不包含这些文件,如果是这种情况我会感到惊讶,那么您可以从 Platform SDK 获取它们。也就是说,如果您对在 Windows 上编程很认真,那么您应该掌握一个工具,让您可以访问 Windows API。

    我确实建议您对此类任务使用完全限定的路径。由于您的文本文件与可执行文件位于同一目录中,因此您只需将该目录加入文本文件的名称即可。通过调用GetModuleFileName 并为hModule 参数传递NULL 来获取可执行文件的完整路径。

    【讨论】:

    • @DadvidHeferman 感谢您的即时回复。那行得通。似乎我的编译器包含所需的文件。或许你也知道我的第二个问题的答案?
    • 最后一段就是这样做的。在指定文件名时,我总是更喜欢明确。获取包含该文件的目录的完整路径。用文件名加入它,你就可以开始了。
    • 如果我是对的,GetModuleFileName 也会给我 ProgramName.exe,所以我必须删除它,对吗?
    • 没错。您应该能够使用一些库代码来执行此操作。本质上,您从字符串的末尾开始并返回,直到找到路径分隔符。
    • 或者你可以调用winapi函数PathRemoveFileSpec msdn.microsoft.com/en-us/library/bb773748(v=vs.85).aspx
    猜你喜欢
    • 1970-01-01
    • 2014-05-05
    • 2014-02-07
    • 2019-12-20
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多