【问题标题】:working with files on "start without debugging"处理“不调试就开始”的文件
【发布时间】:2012-06-27 05:29:12
【问题描述】:

我正在使用 C 语言进行编程,并且 我有以下问题:

我使用 fopen 并尝试从 csv 文件中读取,该文件当前存储在程序的 exe 文件的文件夹中。

该程序在调试模式和发布模式下工作正常,但是当我尝试在 Visual Studio 2008 Express Edition 上以“不调试的情况下启动”运行该程序时,该程序停止工作并且 Windows 显示一条消息:“ *.exe 已停止工作。某个程序导致该程序停止正常工作。Windows 将关闭该程序并通知您是否有可用的解决方案。

我试过在几台电脑上运行这个程序,结果都是一样的。

我可以给你的另一个信息是,如果我输入文件的完整路径 (C:....file.csv) - 那么它工作得很好,没有任何问题。

我知道我没有编写任何代码,但我希望有人知道为什么会发生这种情况。

先谢谢了。

【问题讨论】:

    标签: c


    【解决方案1】:

    您的程序没有找到 csv 文件,fopen() 失败并返回一个空指针,您尝试使用它而不检查并且您的程序崩溃(只是我的猜测)。

    首先,您必须检查fopen() 是否确实可以打开您的文件:

    FILE* f = fopen("file.csv", "r");
    if(f == NULL) {
      /* print some meaningful error */
    } else {
      /* use the file */
    }
    

    其次,您可以通过从文件所在的同一文件夹执行程序来解决问题。我不是 Windows 人,但如果您创建指向“.exe”的链接,则其属性中可能有一些名为“工作目录”或类似的配置,您可以将其设置为文件所在的路径找到了。

    每个进程都有一个工作目录,通常是它启动的目录,尽管它可能是从父进程继承的,并且可以通过编程方式进行更改。如果加载文件时不指定完整路径,进程会在当前工作目录中搜索文件。

    【讨论】:

    • 对于 OP,除了这个出色的答案之外,您还可以从 main 中查看 argc[0] 以查看调用您的程序的参数是什么。 (就像 Ivella 说的,我敢打赌你的 cwd 与可执行目录不同)。您也可以使用cplusplus.com/reference/clibrary/cstdlib/getenv 对您所在的位置进行一些侦探工作。但是,我认为“最佳”解决方案是将路径作为第一个参数传递给您的程序。从 Visual Studio 启动时,您应该能够定义函数的参数。旋转参数直到它匹配正确的路径。
    猜你喜欢
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多