User Tools

Site Tools


Sidebar

projects

uxi0 (due 20180117)
wcp1 (due 20180117)
adm0 (due 20180124)
wcp2 (due 20180124)
pbx0 (due 20180131)
wcp3 (due 20180131)
pbx1 (due 20180207)
wcp4 (due 20180207)
pbx2 (due 20180214)
wcp5 (due 20180214)
usr0 (due 20180228)
wcp6 (due 20180228)
pbx3 (bonus due 20180228)
upf0 (due 20180307)
wcp7 (due 20180307)
upf1 (due 20180314)
wcp8 (due 20180314)
spf0 (due 20180321)
pwn0 (due 20180321)
wcp9 (due 20180321)
gfo0 (due 20180411)
wcpA (due 20180328)
wpa0 (bonus due 20180411)
wcpB (due 20180411)
gtf0 (due 20180418)
wcpC (due 20180418)
icp0 (due 20180425)
haas:spring2018:unix:stdin_redirection

Original code:

#include<stdio.h>
 
int main()
{
    int a, b, c, d;
    float avg;
 
    printf("Please enter the first number: ");
    scanf("%d", &a);
 
    printf("Please enter the second number: ");
    scanf("%d", &b);
 
    printf("Please enter the third number: ");
    scanf("%d", &c);
 
    printf("Please enter the fourth number: ");
    scanf("%d", &d);
 
    avg = (float)(a + b + c + d) / 4;      // force operation to be considered float, not native (int)
    printf("The average is %.2f\n", avg);  // format to 2 decimal places with the .2
 
    return(0);
}

With this code typed in, compiled, and ran, you can manually enter the 4 values and should see their average.

Conversely, we can also put our desired input in a file and feed in into our program via I/O redirection:

lab46:~/src/unix$ echo 24 > infile
lab46:~/src/unix$ echo 37 >> infile
lab46:~/src/unix$ echo 16 >> infile
lab46:~/src/unix$ echo 29 >> infile
lab46:~/src/unix$ cat infile
24
37
16
29
lab46:~/src/unix$ ./avgprog < infile

Output may seem a little messy, but that's only because it still expects actual enter keys to be hit. Notice the desired end result IS displayed.

Identical code, minus a lie:

#include<stdio.h>
 
int main()
{
    int a, b, c, d;
    float avg;
 
    fprintf(stdout, "Please enter the first number: ");
    fscanf(stdin, "%d", &a);
 
    fprintf(stdout, "Please enter the second number: ");
    fscanf(stdin, "%d", &b);
 
    fprintf(stdout, "Please enter the third number: ");
    fscanf(stdin, "%d", &c);
 
    fprintf(stdout, "Please enter the fourth number: ");
    fscanf(stdin, "%d", &d);
 
    avg = (float)(a + b + c + d) / 4;      // force operation to be considered float, not native (int)
    fprintf(stdout, "The average is %.2f\n", avg);  // format to 2 decimal places with the .2
 
    return(0);
}

Basically, a regular printf() is IDENTICAL to an fprintf() to stdout. Everything is a file, remember?

Same deal with scanf()/fscanf() from stdin. The lowercase stdin/stdout/stderr are file pointers available to us in C.

haas/spring2018/unix/stdin_redirection.txt · Last modified: 2013/12/24 12:32 by 127.0.0.1