User Tools

Site Tools


Sidebar

projects

uxi0 (due 20170826)
wcp1 (due 20170826)
adm0 (due 20170830)
wcp2 (due 20170902)
pbx0 (due 20170906)
wcp3 (due 20170909)
pbx1 (due 20170913)
wcp4 (due 20170916)
pbx2 (due 20170920)
wcp5 (due 20170923)
upf0 (due 20170927)
wcp6 (due 20170930)
wpa0 (due 20171004)
wcp7 (due 20171007)
usr0 (due 20171018)
pbx3 (BONUS) (due 20171018)
wcp8 (due 20171021)
usf0 (due 20171025)
wcp9 (due 20171028)
gfo0 (due 20171101)
wcpA (due 20171104)
wcpB (due 20171111)
icp0 (due 20171115)
wcpC (due 20171118)
haas:fall2017: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/fall2017/unix/stdin_redirection.txt · Last modified: 2013/12/24 12:32 by 127.0.0.1