iT邦幫忙

1

【c/c++學習筆記】整理讀寫檔案的程式語法

c++

讀寫檔案是寫程式一個蠻實用的技巧,
你可以把程式計算的結果輸出至一個檔案中,
下次有需要用到時再把檔案讀進來,
今天就來整理C語言和c++中如何做檔案的讀寫

一、開關檔案- fopen()、fclose()

fopen()fclose()包含於標頭檔<stdio.h>中,
是開關檔案常用的指令,
不論是讀取檔案或是寫入檔案都需要先把檔案打開,
範例:

#include <stdio.h>

int main()
{
    FILE * pFile;

    pFile = fopen ("myfile.txt", "r");
    if (pFile == NULL)
    {
        perror("檔案不存在");
    }
    else
    {
        printf("開檔成功\n");
        fclose (pFile);
    }
    return 0;
}

這支程式嘗試打開myfile.txt這個檔案,
如果myfile.txt不存在,回報error"檔案不存在"
否則印出開檔成功\n,在檔案存在的情況下,
要用fclose (pFile);把檔案關閉

關於fopen的第二個參數"r",指定檔案是要讀還是要寫,如:

  • r: read
  • w: write
  • a: append

詳情見cplusplus.com- fopen的說明

二、寫檔、讀檔- fwrite()、fread()

fwrite()fread()包含於標頭檔<stdio.h>中,
是讀寫檔案常用的指令

fwrite()

stdio.h 中的 fwrite() 將陣列或結構的內容寫進檔案中,共需四個參數,第一個參數為陣列或結構的指標,第二個參數為陣列或結構的大小,第三個參數為陣列的元素數量,如果是結構就等同 1 個陣列元素,第四個參數為指向結構 FILE 的指標。

這邊示範把兩個int陣列寫入檔案中(如果直接用記事本開檔案會是亂碼):

#include <stdio.h>

int main ()
{
    FILE * pFile;
    int buffer[] = { 23, 42, 63};
    int buffer2[] = { 15, 17, 60};
    pFile = fopen ("myfile.bin", "wb"); //"wb"指以二進制的方式寫檔
    fwrite (buffer, sizeof(int), 3, pFile);
    fwrite (buffer2, sizeof(int), 3, pFile);
    fclose (pFile);
    return 0;
}

參考資料:

  1. 程式語言教學誌- C 語言標準函數庫分類導覽 - stdio.h fwrite()
  2. cplusplus.com- fwrite

fread()

stdio.h 中的 fread() 將檔案的內容寫進陣列或結構中,共需四個參數,第一個參數為陣列或結構的指標,第二個參數為陣列或結構的大小,第三個參數為陣列的元素數量,如果是結構就等同 1 個陣列元素,第四個參數為指向結構 FILE 的指標。

這邊示範把剛剛寫入檔案中的數字印出來(最後一筆資料會印兩次)

#include <stdio.h>

int main ()
{
    FILE *fPtr = fopen("myfile.bin", "rb");
    int res[3];
    if (!fPtr)
    {
        printf("檔案開啟失敗...\n");
    }

    while (!feof(fPtr))
    {
        fread(&res, sizeof(int), 3, fPtr);
        for(int i=0; i<3; i++)
        {
            printf("%d ", res[i]);
        }
        printf("\n");
    }
    fclose(fPtr);
    return 0;
}

參考資料:

  1. 程式語言教學誌- C 語言標準函數庫分類導覽 - stdio.h fread()
  2. cplusplus.com- fread

三、寫檔、讀檔- fputs()、fgets()

fputs()fgets()也包含於標頭檔<stdio.h>中,
是讀寫檔案常用的指令,
fwrite()fread()的差別在於,
fwrite()fread()可以讀寫陣列或是struct
fputs()fgets()用來讀寫字串(char*)的。

fputs()

範例:

#include <stdio.h>

int main ()
{
    FILE *fPtr = fopen("output.txt", "w");
    fputs("把一行字寫進檔案裡\n", fPtr);
    fputs("再把一行字寫進檔案裡\n", fPtr);
    fputs("把三句話寫進檔案裡應該沒問題\n", fPtr);
    fclose(fPtr);
    return 0;
}

用記事本開程式生成的檔案output.txt
可以看到

把一行字寫進檔案裡
再把一行字寫進檔案裡
把三句話寫進檔案裡應該沒問題

fgets()

這邊示範把剛剛那個檔案讀進來

#include <stdio.h>
#define MAX 100
int main ()
{
    FILE *fPtr = fopen("output.txt", "r");
    char buffer[MAX]; // 足夠容納一行字的 buffer
    // 用fgets一次讀進一行(包括換行符號會一起讀進來)
    // fgets的第二個參數是最大讀進字元數量
    while (fgets(buffer, MAX, fPtr))
    {
        printf("%s", buffer);
    }
    fclose(fPtr);
    return 0;
}

四、c++讀寫檔工具- ifstream, ofstream

在c++中,可以使用ifstreamofstream來讀寫檔案,
需要#include <fstream>
其實使用ifstreamofstream與平時操作cin, cout是很像的,
只不過操作的對象便成檔案的讀寫。

ofstream

示範讓使用者輸入一堆數字,寫入檔案output.txt中:

#include <iostream>
#include <fstream>
using namespace std;

int main ()
{
    ofstream fout("output.txt");
    if(!fout)
    {
        cout << "檔案I/O失敗" << endl;
        return 1;
    }

    cout << "輸入數字,以0為結束" << endl;
    while(1)
    {
        int num;
        cin >> num;
        if(num==0)
        {
            break;
        }
        fout << num << endl;
    }
    fout.close();
    return 0;
}

譬如說我依序輸入
5
23
76
0

檔案output.txt就會是:
5
23
76

ifstream

這邊示範把剛剛的檔案output.txt讀進來印在螢幕上:

#include <iostream>
#include <fstream>
using namespace std;

int main ()
{
    ifstream fin("output.txt", ios::in);
    string temp;
    while(getline(fin, temp))
    {
        cout<<temp<<endl;
    }
    fin.close();
    return 0;
}

參考資料:

  1. openhome.cc- 未格式化檔案 I/O

尚未有邦友留言

立即登入留言