C語言輸入輸出函數

轉載自:http://blog.163.com/ruoshui723@126/blog/static/171914155201092142927446/


C語言輸入輸出函數

C語言中基本的輸入輸出函數有:

putchar ():把變量中的一個字符常量輸出到顯示器屏幕上;
getchar ();從鍵盤上輸入一個字符常量,此常量就是該函數的值;
printf  ();把鍵盤中的各類數據,加以格式控制輸出到顯示器屏幕上;
scanf   ();從鍵盤上輸入各類數據,並存放到程序變量中;
puts    ():把數組變量中的一個字符串常量輸出到顯示器屏幕上;
gets    ():從鍵盤上輸入一個字符串常量並放到程序的數組中.
sscanf(); 從一個字符串中提取各類數據。

    putchar() 和 getchar() 顧名思議就是從輸入流中獲取一個字符和輸出一個字符,比較簡單,不再多講。
例子如下:
char c = getchar();
putchar(c);

    格式化輸入輸出scanf()和printf()是最有用的,所以重點講一下。

printf():
一般形式:
printf("格式控制".輸出列表);  
eg : printf("a=%d,b=%f,c=%c\n",a,b,c);
1;格式控制.
格式控制是用雙引號括起來的字符串,也稱"轉換控制字符串",它包含以下兩部分信息.
格式說明:由"%"和格式字符組成,如%d,%f,%c,他的作用是把輸出數據轉換爲指定格式輸出,格式的說明總是由"%"字符開始的.
普通字符:需要原樣輸出的字符,或者是一些有特殊含義的字符,如\n,\t。

2;輸出列表
就是需要輸出的一些數據,也可以是表達式,如果在函數中需要輸出多個變量或表達式,則要用逗號隔開.

    一些特殊字符的輸出:
單引號,雙引號,和反斜槓的輸出在前面加轉義字符”\”
如:”\’”  ,  “\””   ,  “\\”
%的輸出用兩個連在一起的%%,即printf(“%%”);


常用的格式說明如下:
格式字符
d  以十進制形式輸出帶符號整數(正數不輸出符號)
o  以八進制形式輸出無符號整數(不輸出前綴O)
x  以十六進制形式輸出無符號整數(不輸出前綴OX)
u  以十進制形式輸出無符號整數
f  以小數形式輸出單精度實數
lf以小數形式輸出雙精度實數
e  以指數形式輸出單、雙精度實數
g  以%f%e中較短的輸出寬度輸出單、雙精度實數
c  輸出單個字符
s  輸出字符串

    這裏強調一下:網上很多文章都說f 和lf是一樣的,即不管單精度,雙精度浮點數,都可以用f, 但我在POJ上做過測試,輸出Double時用f確實也可以,但讀入時,用f就報WA,所以大家如果對Double進行讀寫的話,都用lf吧。
說到Double,再囉嗦一句,建議大家要用到浮點數時都用Double,不要用float,因爲在很多情況下,float精度不夠會導致WA。

特殊:
對64位整數的輸入輸出,在POJ上的C++環境下(即VC),64位整數是:
__int64    (注意int前面是兩個下劃線)
輸入輸出格式爲”%I64d”.
在G++環境下(即Dev C++) 64位整數是
long long
輸入輸出格式爲”%lld”.


輸出寬度

  用十進制整數來表示輸出的最少位數。 注意若實際位數多於定義的寬度,則按實際位數輸出,若實際位數少於定義的寬度則補以空格或0。

精度
  精度格式符以“.”開頭,後跟十進制整數。意義是:如果輸出數字,則表示小數的位數;如果輸出的是字符,則表示輸出字符的個數;若實際位數大於所定義的精度數,則截去超過的部分。

標誌格式字符
-  結果左對齊,右邊填空格
+  輸出符號(正號或負號)空格輸出值爲正時冠以空格,爲負時冠以負號

例如:
double c=24212345.24232;
printf(“%020.4”);  表示輸出精確到小數點後4位,輸出佔20位,若有空餘的位補0.

    scanf:

scanf的很多用法都是和printf對應的,故不再贅述。
說一下scanf一個特別好用的地方,就是可以濾去一些不想要的東西。
舉例說明如下:
比如輸入爲日期 yyyy-mm-dd,就可以這樣寫:
int year,moth,day;
scanf(“%d-%d-%d”,&year,&moth,&day);
再比如:
scanf("%3d %*3d %2d",&m,&n);      輸入113 118 69回車(系統將113賦予m,將69賦予n,因爲*號表示跳過它相應的數據所以118不賦予任何變量)

puts()用的不多,且基本都能用printf()代替,故不再多說。

gets()是從輸入流中獲取一行字符串放入字符數組中:
char in[100];
gets(in);

大家可能最容易出錯的地方就是字符串的輸入,所以強調一下:
能進行字符,字符串輸入的有:
getchar(), scanf(“%c”); scanf(“%s”), gets()

其中getchar() 和 scanf(“%c”)的功能是一樣的。
需要注意的是,這兩個函數讀入的是輸入流中當前位置的字符,
比如:
    scanf(“%d”,&n);
         c = getchar();
假設輸入 67/ (假設“/”代表回車),則第一個scanf讀入一個整數67後,當前輸入流的位置是67之後,即指向回車符,所以第二個getchar()讀入的就是一個回車符了,即 c = ‘\n’。

同樣,gets()也是從當前位置讀入一行字符串。
比如:
scanf(“%d”,&n);
gets(str);
此時讀入字符數組中的字符串就是“\n” 了
所以通常在用scanf讀入一個非字符串的類型之後,如果要讀入字符,或字符數組,都用一個額外的getchar()把回車符讀掉,若後面跟的不止一個回車符,可能還有多餘的空格的話,就用gets()讀掉。

    和以上不同的是,scanf(“%s”) 讀入的時候是會忽略掉空格,回車和製表符的。並且以空格,回車和製表符作爲字符串結束的標誌。

    經常會有這樣的題,輸入第一行是一個整數,接下來每行的第一個是一個字符,用來表示某種操作,後面再跟一些數據,比如:
4
A 100 2
B 23
A 23 89
B 34
像這種輸入就需要小心,讀入字符時不要讀成回車符。
爲了防止意外,我一般是這樣處理這類輸入的:
char model[2];
Scanf(“%d”,&n);
for(…,…,…){
    scanf(“%s”,model);
    if(model[0] == ‘A’){
}
else{
}
}

    sscanf():
sscanf()經常用來分解字符串,功能非常強大,但很多功能都需要正則表達式的知識,所以就介紹一下最簡單的幾種用法,大家如果想了解更多的話,自己去網上找吧。
1.
char str[100],str1[100],str2[100];
gets(str);
sscanf(str,”%s%s”,str1,str2);
將讀入的一整行字符串按空格,製表符或回車符分割成兩個字符串。
2
取指定長度的字符串。如在下例中,取最大長度爲4字節的字符串。
  sscanf("123456 ", "%4s", str);


    對於C++的輸入輸出就不再詳細的講了,因爲cin,cout的速度實在太慢,不推薦使用,我一般都是到萬不得已時才用。
    比如當你要讀入字符串到string 對象中時,就只能用cin了,這時候還有一個常見的問題,就是如何將一整行字符串讀入一個string 中,這就要用到getline函數了。
用法爲:
getline(cin, str);
第一個參數就是標準輸入流cin ,第二個參數是接收讀入數據的string對象,本來還有第三個參數,是結束符的標誌,但通常用它默認的就可以了,所以不用管。

注意區分這個getline和cin.getline的區別:
cin.getline的用法如下:
char str[20];
cin.getline(str,20); 表示從讀入的一行字符串中,取最多20各字符放入字符數組str中,注意此處的str是字符數組,而上面的str是string對象。


    另外需要注意的是,千萬不要把cout和printf混用,因爲cout是帶緩衝的而printf不帶,所以會使得輸出的數據順序混亂。

      1. fopen()函數
      fopen函數用於打開文件, 其調用格式爲:
       FILE *fopen(char *filename, *type);
      在介紹這個函數之;前, 先了解一下下面的知識。
      (1) 流(stream)和文件(file)
      流和文件 在Turbo C2.0中是有區別的, Turbo C2.0 爲編程者和被訪問的設
備之間提供了一層抽象的東西, 稱之爲"流", 而將具體的實際設備叫做文件。
流是一個邏輯設備, 具有相同的行爲。因此, 用來進行磁盤文件寫的函數也同樣
可以用來進行打印機的寫入。在Turbo C2.0中有兩種性質的流:     文字流( text
stream)和二進制(binary stream)。對磁盤來說就是文本文件和二進制文件。本
軟件爲了便於讓讀者易理解Turbo C2.0語言而沒有對流和文件作特別區分。
      (2) 文件指針FILE
      實際上FILE是一個新的數據類型。它是Turbo C2.0的基本數據類型的集合,
稱之爲結構指針。有關結構的概念將在第四節中詳細介紹, 這裏只要將FILE理解
爲一個包括了文件管理有關信息的數據結構, 即在打開文件時必須先定義一個文
件指針。
      (3) 以後介紹的函數調用格式將直接寫出形式參數的數據類型和函數返回值
的數據類型。例如: 上面打開文件的函數, 返回一個文件指針, 其中形式參數有
兩個, 均爲字符型變量(字符串數組或字符串指針)。
      現在再來看打開文件函數的用法。
      fopen()函數中第一個形式參數表示文件名, 可以包含路徑和文件名兩部分。
如:
       "B:TEST.DAT"
       "C:\\TC\\TEST.DAT"
      如果將路徑寫成"C:\TC\TEST.DAT"是不正確的, 這一點要特別注意。
      第二個形式參數表示打開文件的類型。關於文件類型的規定參見下表。
                         表    文件操作類型
      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
            字符                  含義
      ────────────────────────────
             "r"             打開文字文件只讀
             "w"             創建文字文件只寫
             "a"             增補, 如果文件不存在則創建一個
             "r+"            打開一個文字文件讀/寫
             "w+"            創建一個文字文件讀/寫
             "a+"            打開或創建一個文件增補
             "b"             二進制文件(可以和上面每一項合用)
             "t"             文這文件(默認項)
      ━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      如果要打開一個CCDOS子目錄中, 文件名爲CLIB的二進制文件, 可寫成:
       fopen("c:\\ccdos\\clib", "rb");
      如果成功的打開一個文件, fopen()函數返回文件指針,否則返回空指針(NULL)。由此可判斷文件打開是否成功。

      2. fclose()函數
      fclose()函數用來關閉一個由fopen()函數打開的文件 , 其調用格式爲:
        int fclose(FILE *stream);
      該函數返回一個整型數。當文件關閉成功時, 返回0, 否則返回一個非零值。
可以根據函數的返回值判斷文件是否關閉成功。
      例10:
       #iclude<stdio.h>
       main()
       {
            FILE *fp;                 
            int i;
            fp=fopen("CLIB", "rb");   
            if(fp==NULL)              
               puts("File open error");
            i=fclose(fp);             
            if(i==0)                  
              printf("O.K");          
            else
              puts("File close error");
       }

     二、有關文件操作的函數
      本節所涉及到的文件讀寫函數均是指順序讀寫,即讀寫了一條信息後,指針自動
加1。下面分別介紹寫操作函數和讀操作函數。

      1. 文件的順序寫函數 
   fprintf()、fputs()和fputc()函數 均爲文件的順序寫操作函數,其調用格式如下:
      int fprintf(FILE *stream, char *format, <variable-list>);
      int fputs(char *string, FILE *steam);
      int fputc(int ch, FILE *steam);
      上述三個函數的返回值均爲整型量

fprintf() 函數的返回值爲實際寫入文件中的字符個數(字節數)。如果寫錯誤, 則返回一個負數

fputs()函數返回0時表明將string指針所指的字符串寫入文件中的操作成功,返回非0時,表明寫操作失敗。

fputc()函數返回一個向文件所寫字符的值, 此時寫操作成功,否則返回EOF(文件結束結束其值爲-1, 在stdio.h中定義)表示寫操作錯誤。
fprintf( ) 函數中格式化的規定與printf( ) 函數相同,所不同的只是fprintf()函數是向文件中寫入。而printf()是向屏幕輸出。
      下面介紹一個例子, 運行後產後一個test.dat的文件。
      例11:
       #include<stdio.h>
       main()
       {
            char *s="That's good news");   
            int i=617;                     
            FILE *fp;                      
            fp=fopen("test.dat", "w");     
            fputs("Your score of TOEFLis", fp);
            fputc(':', fp);                
            fprintf(fp, "%d\n", i);        
            fprintf(fp, "%s", s);          
            fclose(fp);                    
       }
      用DOS的TYPE命令顯示TEST.DAT的內容如下所示:
      屏幕顯示
        Your score of TOEFL is: 617
        That's good news
2. 文件的順序讀操作函數
      fscanf()、fgets()和fgetc()函數
      函數fscanf()、fgets()和fgetc()均爲文件的順序讀操作函數, 其調用格式
如下:
       int fscanf(FILE *stream, char *format, <address-list>);
       char fgets(char *string, int n, FILE *steam);
       int fgetc(FILE *steam);
      fscanf()函數的用法與scanf()函數相似,只是它是從文件中讀到信息。
fscanf()函數的返回值爲EOF(即-1), 表明讀錯誤, 否則讀數據成功。

fgets()函數從文件中讀取至多n-1個字符(n用來指定字符數), 並把它們放入string指向的字符串中, 在讀入之後自動向字符串未尾加一個空字符, 讀成功返回string指針,
失敗返回一個空指針。

fgetc()函數返回文件當前位置的一個字符,讀錯誤時返回EOF。
      下面程序讀取例11產生的test.dat文件, 並將讀出的結果顯示在屏幕上。
      例12
       #include<stdio.h>
       main()
       {
            char *s, m[20];
            int i;
            FILE    *fp;
            fp=fopen("test.dat", "r");     
            fgets(s, 24, fp);              
            printf("%s", s);               
            fscanf(fp, "%d", &i);          
            printf("%d", i);               
            putchar(fgetc(fp));            
            fgets(m, 17, fp);              
            puts(m);                       
            fclose(fp);                    
            getch();                       
       }
      運行後屏幕顯示:
      Your score of TOEFL is: 617
      That's good news
      如果將上例中fscanf(fp, "%d", &i)改爲fscanf(fp, "%s", m),    再將其後
的輸出語句改爲printf("%s", m), 則可得出同樣的結果。由此可見Turbo C2. 0
中只要是讀文字文件, 則不論是字符還是數字都將按其ASCII值處理。 另外還要
說明的一點就是fscanf()函數讀到空白符時, 便自動結束,C語言輸入輸出函數 (看樣子scanf是過不去空格這一關呀)在使用時要特別注意。

      3. 文件的隨機讀寫
      有時用戶想直接讀取文件中間某處的信息, 若用文件的順序讀寫必須從文件
頭開始直到要求的文件位置再讀, 這顯然不方便。Turbo C2.0提供了一組文件的
隨機讀寫函數, 即可以將文件位置指針定位在所要求讀寫的地方直接讀寫。
      文件的隨機讀寫函數如下:
      int fseek (FILE *stream, long offset, int fromwhere);
      int fread(void *buf, int size, int count, FILE *stream);
      int fwrite(void *buf, int size, int count, FILE *stream);
      long ftell(FILE *stream);
      fseek()函數的作用是將文件的位置指針設置到從fromwhere開始的第offset
字節的位置上, 其中fromwhere是下列幾個宏定義之一:
      文件位置指針起始計算位置fromwhere
━━━━━━━━━━━━━━━━━━━━━━━━━━━
      符號常數          數值             含義
───────────────────────────
      SEEK_SET            0          從文件開頭
      SEEK_CUR            1          從文件指針的現行位置
      SEEK_END            2          從文件末尾
━━━━━━━━━━━━━━━━━━━━━━━━━━━
      offset是指文件位置指針從指定開始位置(fromwhere指出的位置)跳過的字
節數。它是一個長整型量, 以支持大於64K字節的文件。fseek()函數一般用於對
二進制文件進行操作。
      當fseek()函數返回0時表明操作成功, 返回非0表示失敗。
      下面程序從二進制文件test_b.dat中讀取第8個字節。
      例13:
       #include<stdio.h>
       main()
       {
            FILE *fp;
            if((fp=fopen("test_b.dat", "rb"))==NULL)
              {
                printf("Can't open file");
                exit(1);
              }
            fseek(fp, 8. 1, SEEK_SET);
            fgetc(fp);
            fclose(fp);
       }
      fread()函數是從文件中讀count個字段, 每個字段長度爲size個字節, 並把
它們存放到buf指針所指的緩衝器中。
      fwrite()函數是把buf指針所指的緩衝器中, 長度爲size個字節的count個字
段寫到stream指向的文件中去。
      隨着讀和寫字節數的增大, 文件位置指示器也增大, 讀多少個字節, 文件位
置指示器相應也跳過多少個字節。讀寫完畢函數返回所讀和所寫的字段個數。
      ftell()函數返回文件位置指示器的當前值,這個值是指示器從文件頭開始
算起的字節數, 返回的數爲長整型數, 當返回-1時, 表明出現錯誤。

      下面程序把一個浮點數組以二進制方式寫入文件test_b.dat中。
      例14:
       #include <stdio.h>
       main()
       {
            float f[6]={3.2, -4.34, 25.04, 0.1, 50.56, 80.5};
                          
            int i;
            FILE *fp;
            fp=fopen("test_b.dat", "wb");
            fwrite(f, sizeof(float), 6, fp);
            fclose(fp);                    
       }
      下面例子從test_b.dat文件中讀100個整型數, 並把它們放到dat數組中。
      例15:
       #include <stdio.h>
       main()
       {
            FILE *fp;
            int dat[100];
            fp=fopen("test_b.dat", "rb");
            if(fread(dat, sizeof(int), 100, fp)!=100)
                                         
              {
                 if(feof(fp))
                   printf("End of file");
                 else
                   printf("Read error");   
            fclose(fp);                    
       }
      注意:
      當用標準文件函數對文件進行讀寫操作時, 首先將所讀寫的內容放進緩衝區,
即寫函數只對輸出緩衝區進行操作, 讀函數只對輸入緩衝區進行操作。例如向一
個文件寫入內容, 所寫的內容將首先放在輸出緩衝區中, 直到輸出緩衝區存滿或
使用fclose()函數關閉文件時, 緩衝區的內容纔會寫入文件中。若無fclose()
函數, 則不會向文件中存入所寫的內容或寫入的文件內容不全。有一個對緩衝區
進行刷新的函數, 即fflush(), 其調用格式爲:
      int fflush(FILE *stream);
      該函數將輸出緩衝區的內容實際寫入文件中, 而將輸入緩衝區的內容清除掉。

      4. feof()和rewind()函數
      這兩個函數的調用格式爲:
       int feof(FILE *stream);
       int rewind(FILE *stream);
      feof()函數檢測文件位置指示器是否到達了文件結尾,若是則返回一個非0
值, 否則返回0
。這個函數對二進制文件操作特別有用, 因爲二進制文件中,文件結尾標誌EOF也是一個合法的二進制數,只簡單的檢查讀入字符的值來判斷文件是否結束是不行的。如果那樣的話, 可能會造成文件未結尾而被認爲結尾, 所
以就必須有feof()函數。
      下面的這條語句是常用的判斷文件是否結束的方法。
       while(!feof(fp))
          fgetc(fp);
      while爲循環語句, 將在下面介紹。
      rewind()函數用於把文件位置指示器移到文件的起點處, 成功時返回0,否
則, 返回非0值。

   1.2.2    非標準文件函數
      這類函數最早用於UNIX操作系統, ANSI標準未定義,     但有時也經常用到,
DOS 3.0以上版本支持這些函數。它們的頭文件爲io.h。
      一、文件的打開和關閉
      1. open()函數
      open()函數的作用是打開文件, 其調用格式爲:
       int open(char *filename, int access);
      該函數表示按access的要求打開名爲filename的文件, 返回值爲文件描述字,
其中access有兩部分內容: 基本模式和修飾符, 兩者用" "("或")方式連接。修
飾符可以有多個, 但基本模式只能有一個。access的規定如表3-2。
                 表3-2    access的規定
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
基本模式      含義      修飾符           含    義
────────────────────────────
O_RDONLY      只讀     O_APPEND     文件指針指向末尾
O_WRONLY      只寫     O_CREAT      文件不存在時創建文件,
                                屬性按基本模式屬性
O_RDWR        讀寫     O_TRUNC      若文件存在, 將其長度
                                縮爲0, 屬性不變
                     O_BINARY     打開一個二進制文件
                     O_TEXT       打開一個文字文件
━━━━━━━━━━━━━━━━━━━━━━━━━━━━
      open()函數打開成功, 返回值就是文件描述字的值(非負值), 否則返回-1。
      2. close()函數
      close()函數的作用是關閉由open()函數打開的文件, 其調用格式爲:
       int close(int handle);
      該函數關閉文件描述字handle相連的文件。

發佈了17 篇原創文章 · 獲贊 63 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章