User Tools

Site Tools


Sidebar

projects

pct0 (bonus; due 20190822)
uxi0 (due 20190822)
wcp1 (due 20190822)
pct1 (due 20190828)
wcp2 (due 20190828)
adm0 (due 20190904)
pct2 (due 20190904)
wcp3 (due 20190904)
pbx0 (due 20190911)
pct3 (due 20190911)
wcp4 (due 20190911)
pbx1 (due 20190918)
pct4 (due 20190918)
wcp5 (due 20190918)
pbx2 (due 20190925)
pct5 (due 20190925)
wcp6 (due 20190925)
upf0 (due 20191002)
pct6 (due 20191002)
wcp7 (due 20191002)
upf1 (due 20191009)
pct7 (due 20191009)
wcp8 (due 20191009)
usr0 (due 20191023)
pct8 (bonus; due 20191023)
pct9 (due 20191023)
wcp9 (due 20191023)
wpa0 (due 20191030)
pctA (due 20191030)
wcpA (due 20191030)
pwn0 (due 20191106)
pctB (due 20191106)
wcpB (due 20191106)
gfo0 (due 20191113)
pctC (due 20191113)
wcpC (due 20191113)
EoCE (due 20191211 by 172959)
haas:fall2019: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/fall2019/unix/stdin_redirection.txt · Last modified: 2013/12/24 12:32 by 127.0.0.1