簡易版的 line number 產生器, 包括 C 版本與 Java 版本


C:\JTest> gcc linenum.c

C:\JTest> a < linenum.c
   01 //linenum.c  --- by tsaiwn@csie.nctu.edu.tw
   02 // tcc linenum.c  或是 gcc linenum.c -o linenum
   03 // linenum < inputfile.name
   04 // linenum  < inputFile.name  > outputFile.name
   05 #include <stdio.h>
   06 int main( ) {
   07     static char buf[999];   // 用 static 就不會佔用  Stack 的空間
   08     int n = 0;   // 一開始放 0  這樣加上 1 就是  Line 1
   09     fgets(buf, sizeof(buf), stdin);    // 先讀入一列然後進入  Loop
   10     while(! feof(stdin) ) {   // while檔案stdin (鍵盤) 尚未結束
   11        ++n;
   12        printf("%5.2d %s", n, buf);
   13        buf[0] = 0;    // clear the buffer -- 先把上次讀到的清除 !
   14        fgets(buf, sizeof(buf), stdin);   // 在  Loop 內最後再讀入一列
   15     } // while    // 注意下列很重要喔, 因輸入檔最後一列可能沒 new Line
   16     if(buf[0] != 0) printf("%5.4d %s", ++n, buf);   // 注意 ++n
   17     printf("\n");
   18     if(*buf != 0)fprintf(stderr, "Waring: no newline at end of file\n");
   19     return 0;
   20 }  // main    注意要把 Line numbers 去掉


C:\JTest> 

以下這個 Java 程式做的事與上面的 C 程式做的是完全一樣的 !
好啦, 還是有點不太一樣..
因為 Java 不認識 %5.2d 的格式! 只好使用 %5d 囉,
所以產生列號時前面九列的編號會不同! 
(其實若是 JDK 5.0 以前則根本沒有 printf 可以用 !) 
請看:


C:\JTest> javac lineno.java

C:\JTest> java lineno < lineno.java
    1 //lineno.java  --- by tsaiwn@csie.nctu.edu.tw
    2 // javac lineno.java
    3 // java lineno < file.name
    4 // java lineno < file.name > file.txt
    5 import java.io.*;
    6 import java.util.*;
    7 class lineno {
    8     static PrintStream cout = System.out;
    9     static BufferedReader br = new BufferedReader(
   10                             new InputStreamReader(System.in) );
   11     public static void main(String xxx[ ]) throws Exception {
   12         String s;
   13         int n = 0;
   14         s = br.readLine( ); 
   15         while(s != null) {    // Java 要改為這樣
   16         //while( ! br.eof() ) {  // 因Java 的 BufferReader 沒有 eof( ) 可用
   17              ++n;
   18              cout.printf("%5d %s\r\n", n, s);   // for DOS/Windows
   19              s = br.readLine( );
   20          } // while
   21          cout.printf("\r\n");   // remove "\r" on Unix system
   22      } // main
   23 }

C:\Jtest> 
C:\JTest> java lineno < linenum.c 
    1 //linenum.c  --- by tsaiwn@csie.nctu.edu.tw
    2 // tcc linenum.c  或是 gcc linenum.c -o linenum
    3 // linenum < inputfile.name
    4 // linenum  < inputFile.name  > outputFile.name
    5 #include <stdio.h>
    6 int main( ) {
    7     static char buf[999];   // 用 static 就不會佔用  Stack 的空間
    8     int n = 0;   // 一開始放 0  這樣加上 1 就是  Line 1
    9     fgets(buf, sizeof(buf), stdin);    // 先讀入一列然後進入  Loop
   10     while(! feof(stdin) ) {   // while檔案stdin (鍵盤) 尚未結束
   11        ++n;
   12        printf("%5.2d %s", n, buf);
   13        buf[0] = 0;    // clear the buffer -- 先把上次讀到的清除 !
   14        fgets(buf, sizeof(buf), stdin);   // 在  Loop 內最後再讀入一列
   15     } // while    // 注意下列很重要喔, 因輸入檔最後一列可能沒 new Line
   16     if(buf[0] != 0) printf("%5.4d %s", ++n, buf);   // 注意 ++n
   17     printf("\n");
   18     if(*buf != 0)fprintf(stderr, "Waring: no newline at end of file\n");
   19     return 0;
   20 }  // main    注意要把 Line numbers 去掉

C:\Jtest> 


這兩個 (linenum.c, lineno.java)的原始碼電子檔放在我們的教材參考資料區


補充說明:
linenum.c 這是比較簡單的 C 版本
lineno.java 這是 Java 的版本 
兩個都很簡單, 都須利用 I/O 轉向才可以讀取檔案