Copy Programs
Standard copy in C and C++
A standard simple program in a Unix environment is to copy
the standard input to the standard output.
Here is a standard simple version in the C language:
| Copy Program in C |
Copy Program in C++ |
/* copy.c: simplest C copy program * copies stdin to stdout */ #include <stdio.h> int main(void) { int ch; while ((ch = getchar()) != EOF) putchar(ch); } ------------------------------------------------- % lint copy.c # try out lint (9) warning:Function has no return statement:main function falls off bottom without returning value (9) main function returns value which is always ignored putchar % cc -o copy copy.c % copy # copy: terminal to terminal Now is the time # input echoed on next line Now is the time for all good men ... # ditto for all good men ... # ctrl-d entered for end-of-file % copy < copy.c > copy2.c # use redirection % cat copy2.c # result of copy /* copy.c: simplest C copy program * copies stdin to stdout */ #include int main(void) { int ch; while ((ch = getchar()) != EOF) putchar(ch); } % gcc -o copy_gcc copy.c # C compiler % CC -o copy_CC copy.c # C++ complier % g++ -o copy_gpp copy.c # C++ complier # All 3 compilers produce above results
|
// copy.cc: simplest C++ copy program // copies cin to cout // #include <iostream.h> int main() { char ch; while (cin.get(ch)) cout.put(ch); } ------------------------------------- % CC -o copy_cc copy.cc % copy_cc Now is the time Now is the time for all good men ... for all good men ... # ctrl-d entered for end-of-file % copy_cc < copy.cc > copy2.cc % cat copy2.cc // copy.cc: simplest C++ copy program // copies cin to cout // #include int main() { char ch; while (cin.get(ch)) cout.put(ch); }
|
The C copy program on the left above also compiles and runs under C++,
but C++ provides a different style, shown on the right above. Note that
the C++
function cin.get(ch); uses a C++
reference
parameter, not available in C or in Java, so that after the
call, the value of the next character "pops into" the variable
ch. (In C, one would have to
pass the address of
ch, that is &ch,
and in Java this
style is not possible.)
Simple copy in Java
The shortest corresponding program in Java is a little more complex.
Sending a character to the standard output is simple and
similar: System.out.print(ch);,
but
input requires that one takes an I/O exception condition
into account. Also, the function read()
returns an int. Without the
cast
(char)ch below, the program
would print the
Ascii integer value, rather than the character.
(This and other programs here were adapted from the Gosling
Java text.)
| Copy Program in Java |
// CopyFirst.java: copy standard input to standard output import java.io.*; class CopyFirst { public static void main(String[] args) throws IOException { int ch; while ((ch = System.in.read()) != -1) System.out.print((char)ch); } } -------------------------------------------------------------- % javac CopyFirst.java % java CopyFirst Now is the time Now is the time for all good men ... for all good men ... # ctrl-d entered for end-of-file % java CopyFirst < CopyFirst.java > CopyFirst2.java % cat CopyFirst2.java // CopyFirst.java: copy standard input to standard output import java.io.*; class CopyFirst { public static void main(String[] args) throws IOException { int ch; while ((ch = System.in.read()) != -1) System.out.print((char)ch); } }
|
The above program is not good style for input in
Java, since the extra "throws" clause would be
needed anywhere this input code is called from.
For a through discussion of copying in Java, see:
Copy programs in
Java.
Line-by-line copy in C:
Here is a C copy program that copies each line separately.
In the Unix world, a text file has to behave as if there were
a single newline character at the end of each record, but nothing
else between. (This is simulated even if it is not the case.)
One complication is that it is legal to leave off the newline
at the end. In order to test for end-of-file, one needs
to read past the final character in the file, and test for
EOF.
| Line-by-line Copy
Program in C |
/* copy3.c: copy line-by-line */ #include int main(void) { int ch; int linenum = 0; while ((ch = getchar()) != EOF) { printf("Line %2i:", ++linenum); while (ch != '
' && ch != EOF) { putchar(ch); ch = getchar(); } if (ch == EOF) break; /* in case no newline at end */ putchar(ch); /* write the newline */ } } -------------------------------------------------------------- % cc -o copy3 copy3.c % copy3 < copy3.c # direct copy3.c in; output to terminal Line 1:/* copy3.c: copy line-by-line Line 2: */ Line 3:#include Line 4:int main(void) { Line 5: int ch; Line 6: int linenum = 0; Line 7: while ((ch = getchar()) != EOF) { Line 8: printf("Line %2i:", ++linenum); Line 9: while (ch != '
' && ch != EOF) { Line 10: putchar(ch); Line 11: ch = getchar(); Line 12: } Line 13: if (ch == EOF) break; /* in case no newline at end */ Line 14: putchar(ch); /* write the newline */ Line 15: } Line 16:} % vi copy3.c (delete newline at end of file copy3.c) "copy3.c" [Incomplete last line] 16 lines, 381 characters % copy3 < copy3.c Line 1:/* copy3.c: copy line-by-line Line 2: */ Line 3:#include Line 4:int main(void) { Line 5: int ch; Line 6: int linenum = 0; Line 7: while ((ch = getchar()) != EOF) { Line 8: printf("Line %2i:", ++linenum); Line 9: while (ch != '
' && ch != EOF) { Line 10: putchar(ch); Line 11: ch = getchar(); Line 12: } Line 13: if (ch == EOF) break; /* in case no newline at end */ Line 14: putchar(ch); /* write the newline */ Line 15: } Line 16:}% # Unix prompt at end; no newline
|
Created By Dr. Neal
Wager : The University of Texas at San Antonio