c++ - 在 Windows 命令行中运行 .exe 会在以 2 种相同方式执行时产生不同的输出
问题描述
我的项目的子目录中有以下 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
为什么会这样?
解决方案
在失败的情况下,当前工作目录不是您所期望的。
您正在使用相对路径加载输入文件,该路径无法找到该文件,但您没有检查freopen()
错误的返回值。
您从中读取的变量未初始化,并且在使用变量之前cin
您没有检查错误的结果。operator>>
它们在错误时保持不变。这就是为什么您在输出中获得随机值的原因。
您需要使用输入文件的绝对路径,而不是相对路径。
由于输入文件与您的可执行文件位于同一目录中,您可以首先检索可执行文件的完整路径字符串(通过argv[0]
参数 ofmain()
或通过GetModuleFileName()
Windows 上的系统调用),修改它以将12.cpp.exe
文件名部分替换为input.txt
,然后使用该完整路径字符串加载输入文件。
推荐阅读
- c++ - 为什么当我指定正确的 *.lib 时,libtorch1.5 出现 LNK2019 错误
- html - 如何在我的 Twitter 克隆中并排设置侧边栏、Feed 和小部件?
- javascript - 来自点符号的 Joi 对象模式
- python - 如何在节点中用scrapy get all methode刮掉所有文本
? - python - 为什么没有填充缺失值?
- asp.net-core - .NET Core - 找不到简单的肥皂请求代码
- java - Java ImageIO,无法读取输入文件
- angular - Angular 10:在运行时在变量中翻译 i18n 已知的字符串
- python - 如何计算 MxN 相关矩阵
- talend - 根据列的值将 Tmap 输出拆分为多个表