2016年9月19日 星期一

給新手的C++教學 (上冊) - 13 - 8. 簡易的檔案處理

回到「給新手的C++教學 (上冊)」

回到「13. 額外語法 (Extra syntax)」

上一頁

您是否有想過要用C++來讀取和寫入檔案呢?
真的可以嗎?需不需要解析磁碟機NTFS、FAT32之類的格式啊?
當然不需要!

放心,這件事連小莫都不知道怎麼做
所謂「站在巨人的肩膀上」,這種事情不用再由我們自己處理了!
在先人的努力之下,「C++」這個偉大的程式語言,已經讓電腦可以只依據簡單的幾行程式碼,就可以執行許多複雜卻需要經常執行的工作

事實上,C++讀寫檔案的方法比你想的任何方式都簡單!
更具體地來講
我們在撰寫C++程式碼的時候,只需要告訴電腦「讀取哪個檔案」和 (或)「寫入哪個檔案」就好了!

要怎麼告訴電腦「恩,我要從這個檔案名稱為『in.txt』的檔案讀取」呢?
(請先到檔案總管設定顯示附檔名以取得完整的檔案名稱 (點我查看教學))
寫下一行程式碼就夠了:


freopen("in.txt","r",stdin);

這樣一來,之後的「輸入」都會從「in.txt」這個檔案讀取
甚麼意思呢?
我們來看一個例子:

#include<cstdio>
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        int v;
        scanf("%d",&v);
        printf("%d\n",v*v);
    }
    return 0;
}
輸入「10 1 2 3 4 5 6 7 8 9 10」的情況

每次執行都要手動輸入「10 1 2 3 4 5 6 7 8 9 10」好煩喔 (不管是一個字一個字慢慢打還是直接「Ctrl+V」貼上)

當然,本頁的解決方案是「用檔案代替手動輸入」
只要在執行檔所在的資料夾建立一個內容為「輸入」的檔案,然後在main函式開頭加入「freopen("檔名","r",stdin);」就好了!
這樣講你可能不懂,用截圖來解釋最清楚!

步驟如下:
這是原本的程式碼
按下鍵盤上的「Ctrl+B」(開啟檔案所在的資料夾)
在資料夾中點一下滑鼠右鍵
「新增 (New)」→「文字文件 (Text Document)」
出現一個文字文件
命名為「in.txt」
按「Enter」完成命名
按「Enter」開啟檔案以編輯內容
將輸入「10 1 2 3 4 5 6 7 8 9 10」打進去並存檔
回到「Dev-C++」
在main函式的開頭插入「freopen("in.txt","r",stdin);」這一行程式碼
按下鍵盤上的「F11」,即可直接看到用「in.txt」的內容來輸入的執行結果

耶,我們成功讓程式自動使用「in.txt」的內容來當作輸入了!
這就是C++「讀取檔案」的方式

那麼,要怎麼用C++「寫入檔案」呢?
一樣,一行程式碼搞定:

freopen("out.txt","w",stdout);

這樣一來,之後的「輸出」都會寫入到「out.txt」這個檔案
甚麼意思呢?
我們來看一個例子:

#include<cstdio>
int main()
{
    for(int a=1;a<=99;a++)
    {
        for(int b=1;b<=99;b++)
        {
            printf("%5d",a*b);
        }
        printf("\n");
    }
    return 0;
}
傳說中的「九九九九乘法表」,輸出好龐大
電腦沒有很好,所以跑了整整6秒多XD

可以發現,輸出時在大巨大了,以致於原本應該顯示在同一行的文字,硬生生地被切成好幾段並分行顯示
看起來好痛苦 >_<

當然,本頁的解決方案是「『輸出到檔案再用別的軟體開啟檢視』代替『原始的黑色視窗顯示方式』」

只要在main函式開頭加入「freopen("檔名","w",stdout);」就好了!
這樣講你可能不懂,用截圖來解釋最清楚!

步驟如下:
這是原本的程式碼
在main函式的開頭插入「freopen("out.txt","w",stdout);
按下鍵盤上的「F11」執行程式,很快就執行完了!
回到「Dev-C++」
按下鍵盤上的「Ctrl+B」開啟檔案所在的資料夾
在開起的資料夾中找到剛剛程式輸出的檔案「out.txt」
按「Enter」或滑鼠連點兩下開啟「out.txt」
Wow~這是我們漂亮的輸出!
檔案的右下角,還是一樣整齊~

耶,我們成功讓程式自動將輸出儲存成「out.txt」了!
這就是C++「寫入檔案」的方式

可以看到,不管是「輸出」還是「輸入」,我們都使用到了一個名字叫做「freopen」的函式
它可以很幫便快速地使用,但是也有一個很明顯的缺點:
一旦使用後,就無法再回去使用黑色視窗輸入或輸出了!

下一頁將簡單地介紹功能更完整的檔案讀寫方法!

下一頁

感謝:
(版權所有 All copyright reserved)

2 則留言:

  1. 為甚麼輸出的路徑設成別的就寫不進去了??

    回覆刪除
    回覆
    1. freopen要加在main函式開頭哦~
      如果還有疑問,歡迎貼上您的程式碼~ ^_^

      刪除

歡迎留言或問問題~
若您的留言中包含程式碼,請參考這篇
如果留言不見了請別慌,那是因為被google誤判成垃圾留言,小莫會盡快將其手動還原