输入重定向不起作用?

时间:2013-01-30 01:33:16

标签: c

我的指示:编写一个重复(直到文件结尾)读入一个字符的程序 来自输入流。如果字符为大写,请将其更改为小写 并将其写入输出流。对于所有其他角色,请写下 字符不变为输出流。 使用getchar()进行输入,使用putchar()进行输出,并使用输入重定向 用于将输入文件连接到程序

我的项目名称是输入,我的文本文件是input.txt。当我运行它时,我输入“输入< input.txt”程序只是在命令窗口模仿它,所以如何让它从文本文件中读取?

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main()
{
  char c, x;


   c=getchar();

  while (c != EOF)
 {

    c=getchar();
     x = tolower(c);
     if (isupper(c))
    {
        putchar(x);

    }
    else 
    {
        putchar(c);

    }

 }
    system("Pause");
}

2 个答案:

答案 0 :(得分:0)

我认为问题在于您不想转到该程序并输入Input < input.txt。相反,您要打开终端程序,将目录更改为包含项目的目录,然后通过编写Input < input.txt从命令行运行该程序。这将启动程序并使用input.txt的内容作为标准输入流,而不是从控制台读取文本。

那就是说,代码中有两个错误。首先,请注意您有一行

c = getchar();

在循环之外执行输入读取。然后立即致电

c = getchar();

再次进入循环内部。这意味着您要丢弃您所读的第一个字符。

其次,你的循环运行的时间超过了它需要的时间。如果对getchar()的第二次调用返回EOF,则在当前循环迭代完成之后才会检测到此情况。这是因为您对EOF的检查位于循环的顶部,直到您打印出EOF字符后才能检查到。要解决这个问题,请考虑使用循环半成语并在中间突破循环:

for (;;) {
    /* Read data. */
    if (/* no data left */) break;

    /* Process data. */
}

从风格上讲,您确定在这里需要ifelse分支吗?回想一下,tolower不会更改非大写字符的值,因此有一个大写字母和一个小写字母的情况是多余的。您可以在没有特殊情况的情况下输出tolower生成的字符。

希望这有帮助!

答案 1 :(得分:0)

仅为ASCII文本执行的惯用方法是:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>


int main()
{
    int c;

    while((c = getchar()) != EOF)
        putchar(tolower(c));

    exit(EXIT_SUCCESS);
}

正如教科书如此喜欢说的那样, UTF-8留给读者轻松练习; - )