重定向和文件:

令程序与文件一同工作有两种方式:一种是明确地使用打开文件,关闭文件,读文件,写文件等等专门的函数。第二种是使用一个设计用于与键盘和屏幕共同工作的程序,但是使用不同通道重定向输入和输出(何谓输入输出重定向?默认情况下输入是由键盘输入的。输出是默认的输出到屏幕上。而输入输出重定向就是改变默认的输入输出方向)重定向是与其系统相关联而不是与C相关联。

输入重定向:如前面的程序是标准输入(键盘输入)现在要从一个word或txt文件中读取输就会用到<符号来重定向如:程序名 < 文件名(txt,word这个文件一定要在同一目录下)。<这个符号是系统重定向运算符。该运算符把word或txt文件与stdin流关联起来,将该文件的内容引导至程序。而程序本身并不知道输入来自文件还是来自键盘,该文件所知道的一切就是向它传送了一字符流。由于C将文件和I/O设备置于相同的地位,所以现在这个文件就是I/O设置。

输出重定向:

输出重定向与输入重定向相反的作用:就是把程序的标准输入输出到一个指定的文件输出 可以用>输出重定向运算符方法:程序名 > 文件名(要加后辍)。该重定向将stdout流从显示设备重定向到文件

组合重定向:

使用重定向运算符( < 和 > )所遵循的规则:

1重定向运算符将一个可执行程序与一个数据文件连接起来。该运算符不能用于一个数

据文件与另数据文件的连接,也不能用于一个程序与另一个程序的连接。

2使用这些运算行时输入不能来自一个以上的文件,输出也不能定向一个以上的文件。

3除了偶尔在使用到系统具有特殊意义的字符时,名字和操作符之间空格并不是必需的。

系统还可能具有(>>)运算符:该运算符可使你向一个现有文件的末尾追加数据。还有管道运算符(|)它可以将一个程序的输出与第二个程序的输入连接起来

注释:

重定向使你能够把键盘输入程序用于文件。要使其工作,该程序必须能够检测文件尾。重定向是一个命令行概念,因为你要通过在命令行键入特殊符号来指示它。

创建一个更友好的用户界面:

缓冲输入通常会给用户带来方便,它提供了在将输入发送至程序前对其进行编辑的机会,但在使用字输入时会给编程人员画带来麻烦,因为getchar()不会跳过回车把所有的字符都读取这就给程序带来了一些副作用。如下面的程序:

//8-4.c

#include <stdio.h>

int main (void)

{

int guess = 1;

printf ("Pick an intger from 1 to 100.I will try to guess");

printf ("it .\nRespond with a y if my guess is right and with");

printf ("\nan nif it is wrong .\n");

printf ("Uh... is you mumber %d?\n",guess);

while (getchar () != 'y')

printf ("Well ,then is it %d?\n",++guess);

printf ("I knew I could do it !");

return 0 ;

}

此程序在每次输入n时都会进行两次猜测,在这中间所发生的事情是程序读取n响应并把它看作是你对1的否定,然后读取换行字符并把它看作是你对2的否定。一种解决方案是使用一个while 循环来丢弃输入行的其它部分。包括换行符。如:

while (getchar () != ‘y’)

{

printf ("Well ,then is it %d?\n",++guess);

while (getchar () != ‘n’)

continue;

}

混合输入数字与字符:

在分开时它们可以很好的完成其工作,但是它们不能很好的混合在一起,这是因为getchar ()读取每一个字符,而scanf()它会跳过空格,制表符,和换行符。

//8-5.c

#include <stdio.h>

void display (char cr,int lines,int width);

int main (void)

{

int ch;

int rows,cols;

printf ("Enter a character and two integers :\n");

while ((ch = getchar()) != '\n')

{

scanf ("%d %d",&rows,&cols);

display (ch,rows,cols);

printf ("Enter anoter charcter and two integers:\n");

printf ("Enter a newline to quit. \n");

}

printf ("Bye. \n");

return 0;

}

void display (char cr,int lines,int width)

{

int row ,col;

for (row = 1;row <= lines ;row++)

{

for (col = 1;col <= width;col++)

putchar (cr);

putchar ('\n');

}

}

此程序也只运行一次就退出了,其问题还是出现在gethcar ()会读取包含换行符在内的所有字符,是紧跟在第一个输入行的最后的那个换行符。scanf ()函数将该换行符留在了输入队列中,与sconf ()不同。getchar()并不路过换行符。所以循环的下一个周期,在你有机会输入内容之前,这一换行由getchar()读出,然后赋值给ch,而ch为换行符正是一个终止循环的条件。要解决这一问题,该程序必须跳过一个输入周期中键入的最后一个数字与下一行开始处键入的字符之间所有换行或空格,另外,如果除了gechar()判断之外还可以在scanf()阶段终止该程序。改定后如下:

//8-6.c

#include <stdio.h>

void display (char cr,int lines,int width);

int main (void)

{

int ch;

int rows,cols;

printf ("Enter a character and two integers :\n");

while ((ch = getchar()) != '\n')

{

if (scanf ("%d %d",&rows,&cols) != 2)

break;

display (ch,rows,cols);

while (getchar () != '\n')

continue;

printf ("Enter anoter charcter and two integers:\n");

printf ("Enter a newline to quit. \n");

}

printf ("Bye. \n");

return 0;

}

void display (char cr,int lines,int width)

{

int row ,col;

for (row = 1;row <= lines ;row++)

{

for (col = 1;col <= width;col++)

putchar (cr);

putchar ('\n');

}

}

while语句使程序剔除 scanf()输入后的所有字符。然后通过使用一if语句和一个break判断输入的是不是两个整数。