重定向输入输出的代码块
Posted
技术标签:
【中文标题】重定向输入输出的代码块【英文标题】:Code Blocks redirecting input output 【发布时间】:2012-10-29 01:15:40 【问题描述】:我是代码块的新手,我似乎无法让它与 输出的命令行参数一起工作。有人知道怎么做吗?
我目前能够读取从 argv[1] 传递的文件,但是程序不会自动从给定文件读取输入,也不会将输出正确地输出到文件输出。
我知道它在设置程序的参数上,我的参数行是:list.txt 输出
经过一番研究,我看到一个人这样做: ./output,似乎运行一个程序来提供输入和输出,无论如何,我也尝试过无济于事。我需要使用文件处理程序与之交互吗?它没有意义,简单的 getchar() 应该从传递的输入文件中读取。
我在这里错过了什么?
提前致谢
【问题讨论】:
这仅重定向标准输入和输出。使用printf()
和scanf()
、puts()
和getline()
等应该没问题。
它仍然不起作用:(我已经将 getchar() 更改为我想要的整行,现在我在字符串中逐个字符地获取字符但是,当我运行它时,它还在等待手动输入。我真的认为这是一个代码块问题。
不,这无论如何都不是代码块问题,你错过了一些东西......想象一下,IDE 能做什么?它甚至不是编译器...
好吧,我去了linux,输入命令工作正常,所以一定是IDE问题。而且,它读取 getchar() 就好了,不需要 scanf 或 get 从 我知道这是一个老话题,但没有一个解决方案足够好。对于 Windows,我可能会在全局范围内使用以下宏定义(因为您可能也需要它来进行调试打印或类似操作)
#include <cstdio>
#ifdef DEBUG
#define D(X) X
#else
#define D(X)
#endif
然后作为第一行或第二行(如果您需要 std::ios::sync_with_stdio(false); )在 main 中将其用作
int main()
D(freopen("input.txt","r",stdin);)
D(freopen("ouput.txt","w",stdout);)
...
并在 Projects > Build Options... > (Debug, Compiler Settings, #defines) 下的 Code::Blocks 中定义
调试
期望“input.txt”是其余 .c 或 .cpp 文件所在文件夹中的文本输入文件,而“output.txt”将是在同一文件夹中生成的输出文件(或者它们可以都作为这样的文件添加到项目中,以便于编辑/查看)。
此解决方案适用于 cin/cout 和 scanf/printf。
【讨论】:
没看懂DEBUG的使用?它到底是做什么的?? @Sumit DEBUG 的使用与程序“#define DEBUG”的第一行相同,但仅在本地选择调试构建时。例如,如果您按照上述说明操作,并将此类代码提交给评分者,则在编译期间将排除“D(”和“)”之间的任何代码,因此,不会因远程系统上丢失的输入文件而窒息/分级机。使用上面的代码/配置,您将获得与在 Linux "<.> ./ouput.txt" 上用于“设置程序的参数”的结果相同的结果。【参考方案2】:我尝试了几乎所有的选项,但未能成功:P 在厌倦了所有这些之后,我基本上使用文件处理来完成我的工作(唷)
这是我在代码中所做的
在全球范围内我写道:
#define DEBUG
#ifdef DEBUG
#include<fstream>
ifstream Inputfile;
ofstream Outputfile;
#define cin Inputfile
#define cout Outputfile
#endif //#ifdef DEBUG
& 在做其他事情之前,我主要写了以下内容:
int main()
#ifdef DEBUG
Inputfile.open("Input.txt");
Outputfile.open("Output.txt");;
#endif // #ifdef DEBUG
最后在关闭主进程之前这样做了:
#ifdef DEBUG
Inputfile.close();
Outputfile.close();
#endif // #ifdef DEBUG
在这之后添加了两个文件
输入.txt
&
输出.txt
到项目
这按预期工作
【讨论】:
这只是 C++【参考方案3】:通过在项目菜单中设置程序参数,我能够将输入重定向到我的 c 程序。
导航到Top Menu>Project>Set programs' arguments
并将</absolute/path/to/yourinputfile
通知<
放在启动它会欺骗代码块重定向文件而不是传递参数。
【讨论】:
尝试使用 Code::Blocks 16.01 但这不起作用,因为它会导致调用Executing: "C:\Program Files (x86)\CodeBlocks/cb_console_runner.exe" "C:\Work\cpp\cout\cout.exe" <input.txt
并且 cb_console_runner.exe 不会将重定向的输入传递给子进程。【参考方案4】:
我认为是cb_console_runner.exe
的问题在IDE 中启动您的程序。 ConsoleRunner
无法解释重定向符号。因此,我在代码块 13.12 的原始代码中添加了一些代码。
请将链接文件复制到 [cb 文件夹]。 (别忘了备份原件。)
二进制: http://limity.tistory.com/attachment/cfile30.uf@241A8D485621595131B28F.exe
源代码: http://limity.tistory.com/attachment/cfile23.uf@231AF3485621595232A632.cpp
【讨论】:
【参考方案5】:我在 CB 13.12 中找到了一种方法
Tools -> Configure Tools -> Add:
Name: whatever
Executable: C:\Windows\System32\cmd.exe
Parameters: /C $TARGET_OUTPUT_BASENAME exampleArg1 <inputFileRedirect.txt
Working Directory: $TARGET_OUTPUT_DIR
它基本上会启动 Windows 控制台并将 Parameters 传递给它。 您还可以为这些工具分配键盘快捷键。 我能看到的唯一缺点是这些工具不是特定于项目的。
【讨论】:
谢谢你,这是唯一在 Windows 上工作的。【参考方案6】:我使用 Code::Blocks 已经有一段时间了,最近我注意到至少在 Windows 中的 Code::Blocks 12.11 也是如此。 > 和 重定向在 Project -> Set programs 参数中不起作用...
一个骇人听闻的解决方案是在构建后步骤中执行。
右键project name -> Build options... -> Pre/post build steps -> Post-build steps:
cmd /C cd /D "bin\$(TARGET_NAME)\" & YourApplicationNameHere.exe >output.txt 2>errors.txt
并选中复选框始终执行,即使目标是最新的。 现在按下 Ctrl+F9,程序将作为构建过程的最后一步执行。
【讨论】:
以上是关于重定向输入输出的代码块的主要内容,如果未能解决你的问题,请参考以下文章