2012年6月4日 星期一

檔案輸出、輸入的基礎


  • 檔案的機制

使用標準程式庫函數,就可以從螢幕或是鍵盤進行輸入、輸出。如果要更進一步將資料長久保存下來,或是需要載入大量資料時,使用檔案來管理資料是不可或缺的一環哦!
在程式中要操作檔案,需要依照以下的順序來進行:

(1)開啟檔案   →   (2)讀取/寫入檔案   →   (3)關閉檔案

所謂檔案的「開啟」、「關閉」,就是在操作開始之前用於輸入、輸出的資料流概念,以及檔案連結與檔案分開等處理。開始使用檔案的時候需要將檔案開啟,最後則需要將檔案關閉。


範例:


#include <stdio.h>

int main(void)
{
    FILE *fp;
    int a, sum=0;
    fp=fopen("test1.txt", "r");  //將檔案開啟
    if(fp==NULL)
    {
        printf("無法開啟檔案。\n");
        return 1;
    }
    while(fscanf(fp, "%d", &a)!=EOF)
    {
        sum+=a;
    }
    fclose(fp);  //將檔案關閉
    fp=fopen("test1.txt", "a");  //將檔案開啟
    fprintf(fp, "%d\n", sum);
    fclose(fp);  //將檔案關閉
    return 0;
}

為了配合這個範例,你可以在本程式所在的資料夾下建立一個檔案,名為"test1.txt",內容如下:
1
2
3
4
5
6
7
8
9
10

  記得在最後面空一行。


注意:

檔案的開啟用fopen()函數來進行。這個函數會傳遞以下兩項引數:檔案名稱、開啟模式(如下表)。傳回值是該檔案的指標(FILE*型態),這個指標稱之為檔案指標或者是資料流指標
此外,基於某種理由而無法開啟檔案時,fopen()函數就會傳回「NULL」這個由巨集所定義的指標。

開啟模式:
"w":用於寫入純文字檔案(檔案內的內容被完全覆蓋)
"r":用於讀取純文字檔案
"a":用於追加寫入純文字檔案(從檔案的末尾開始寫入)
"w+"、"r+"、"a+":與以上相同,但是同時具有寫入跟讀取的權限。
"wb"、"rb"、"ab":與首三者相同,但是是以二進位方式進行。

在程式的最後,使用fclose()函數進行將檔案關閉的處理。如果沒有關閉檔案的話,檔案有時候會因此發生問題,請別忘記這個動作哦!

寫入檔案的函數與輸出用的printf()很相像,是fprintf(),用法與printf()幾乎一樣,只是多了一個引數指定檔案指標。

讀取檔案也是哦,用的是與scanf()相似的fscanf(),一樣多了一個引數用來指定檔案指標。


補充--printf()、scanf()的轉換規格

   printf()以及scanf()是兩個我們非常常用的函數,基本的用法大家都已經大致了解,不外乎是:一個一個對應、長整數用%d、浮點數用%f……等等。
像是%d、%f、%s等等,這些要求它以特定的格式輸出輸入的東西,就叫做轉換規格

printf()轉換規格:
%c 以字元輸出
%d 以10進位輸出
%f 以浮點小數輸出
%e 以科學記號表示,指數部份加上e之後輸出
%E 以科學記號表示,指數部份加上E之後輸出
%s 以字串輸出
%p 以指標輸出
%o 以8進位輸出
%x 以16進位小寫輸出
%X 以16進位大寫輸出
%u 以不帶記號的10進位輸出



scanf()轉換規格:
%c 以字元輸入
%d 以10進位輸入
%f 以浮點小數float輸入
%lf 以浮點小數double輸入
%s 以字串輸入
%p 以指標輸入
%o 以8進位輸入
%x 以16進位輸入
%u 以不帶記號的10進位輸入



  • 指定輸出寬度

這是用於對齊的,常常輸出時想要在螢幕上或是檔案中排列得整齊,就要指定輸出的寬度。
舉例:%5d或%+5d 以5個字元的寬度來輸出,並靠右對齊
%-5d 以5個字元的寬度來輸出,並靠左對齊

  • 指定精度

輸出時也可以指定所輸出的小數點要幾位數,也就是所謂的精度。
舉例:%.3f 輸出至小數點以下3位

以上兩種也可以組合起來哦!例如:%-6.2f,就是將浮點小數向左對齊、總字原寬度為6個字元、輸出至小數點以下2位數。圓周率的話就變成「3.14(空格)(空格)」。

沒有留言:

張貼留言