【问题标题】:Running .exe in Windows command line produce different outputs when executing with 2 same ways在 Windows 命令行中运行 .exe 会在以 2 种相同方式执行时产生不同的输出
【发布时间】:2019-07-08 16:21:29
【问题描述】:

我的项目的子目录中有以下 C++ 代码:/storage/app/users/user1/12/12.cpp

#include <bits/stdc++.h>
using namespace std;

main(){
    int x,y,z,t;
    freopen("input.txt","r",stdin);
    cin >> x >> y >> z >> t;
    cout << x <<" "<< y <<" "<<z <<" "<<t;
}

然后将此代码编译为 .exe 文件: /storage/app/users/user1/12/12.cpp.exe。

input.txt 文件与 2 个给定文件位于同一目录中并包含

1 2 3 4

当我尝试运行 'cd storage/app/users/user1/12 ; ./12.cpp.exe',它产生了预期的输出:1 2 3 4

但是当我尝试直接运行它时:'./storage/app/users/user1/12/12.cpp.exe',它产生了这样一个奇怪的输出:0 4254553 0 1

为什么会这样?

【问题讨论】:

  • HInt:每种情况下的当前路径是什么?由于您使用相对路径,在每种情况下都加载了哪个input.txt文件?
  • 在案例 1 中,它尝试打开 storage/app/users/user1/12/input.txt,在案例 2 中,它尝试打开 ./input.txt。这几乎与 C++ 无关,这是关于系统路径及其工作方式。
  • 您在 Linux 和 Mac OS 中也会遇到同样的问题。

标签: c++ path


【解决方案1】:

在失败的情况下,当前的工作目录不是你所期望的。

您正在使用相对路径加载输入文件,但无法找到该文件,但您没有检查 freopen() 的返回值是否有错误。

您从cin 读取的变量未初始化,并且在使用变量之前您没有检查operator&gt;&gt; 的结果是否有错误。它们在错误时保持不变。这就是为什么您会在输出中获得随机值。

您需要使用输入文件的绝对路径,而不是相对路径。

由于输入文件与您的可执行文件位于同一目录中,您可以首先检索到可执行文件的完整路径字符串(通过main() 的argv[0] 参数,或通过Windows 上的GetModuleFileName() 等系统调用) ,修改它以将12.cpp.exe 文件名部分替换为input.txt,然后使用该完整路径字符串加载输入文件。

【讨论】:

    猜你喜欢
    • 2015-10-23
    • 2022-08-05
    • 2011-05-25
    • 2016-06-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-10-07
    相关资源
    最近更新 更多