重定向输入输出的代码块

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 从 @d0pe 您能否给出一个示例程序来展示您演示的问题以及重现问题所需的步骤? 【参考方案1】:

我知道这是一个老话题,但没有一个解决方案足够好。对于 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&gt;Project&gt;Set programs' arguments 并将&lt;/absolute/path/to/yourinputfile 通知&lt; 放在启动它会欺骗代码块重定向文件而不是传递参数。

【讨论】:

尝试使用 Code::Blocks 16.01 但这不起作用,因为它会导致调用 Executing: "C:\Program Files (x86)\CodeBlocks/cb_console_runner.exe" "C:\Work\cpp\cout\cout.exe" &lt;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 -&gt; Build options... -&gt; Pre/post build steps -&gt; Post-build steps:

cmd /C cd /D "bin\$(TARGET_NAME)\" & YourApplicationNameHere.exe >output.txt 2>errors.txt

并选中复选框始终执行,即使目标是最新的。 现在按下 Ctrl+F9,程序将作为构建过程的最后一步执行。

【讨论】:

以上是关于重定向输入输出的代码块的主要内容,如果未能解决你的问题,请参考以下文章

07输入输出重定向

Unix shell输入输出重定向

C语言输入输出重定向

输入输出重定向

Windows:具有重定向输入和输出的子进程

Linux重定向(输入重定向 | 输出重定向)