User Tools

Site Tools


Sidebar

projects

uxi0 (due 20180822)
wcp1 (due 20180822)
adm0 (due 20180829)
wcp2 (due 20180829)
pbx0 (due 20180905)
wcp3 (due 20180905)
pbx1 (due 20180912)
wcp4 (due 20180912)
pbx2 (due 20180919)
wcp5 (due 20180919)
upf0 (due 20180926)
wcp6 (due 20180926)
upf1 (due 20181003)
wcp7 (due 20181003)
usr0 (due 20181017)
wcp8 (due 20181017)
pbx3 (bonus; due 20181017)
spf0 (due 20181024)
wcp9 (due 20181024)
pwn0 (due 20181031)
wcpA (due 20181031)
gfo0 (due 20181107)
wcpB (due 20181107)
icp0 (due 20181115)
wcpC (due 20181115)
wpa0 (bonus; due 20181128)
EoCE (due 20181213-172959)
haas:fall2018: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/fall2018/unix/stdin_redirection.txt · Last modified: 2013/12/24 12:32 by 127.0.0.1