iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Software Development

C++超級菜鳥也可以懂的物件導向攻略系列 第 19

Day19 - C++ 資料流stream 和文字檔讀取file I/O

  • 分享至 

  • xImage
  •  

前前言:
為什麼要學資料流stream跟file I/O?
那資料等等除了直接寫在程式裡,還可以怎麼輸入進C++程式?
然後顯示出來像看網頁的股市一樣跳出各種資訊,要有資料庫,那就得讀取電腦上我們已經抓下來的資料。
這篇聊到的是文字的寫入跟輸出。

前言:
我們之前聊到variable儲存在記憶體,但等程式結束後就會清空,如果要讓資料在程式結束後還能保存,就要放到像硬碟這樣的儲存地放,今天的主題就是聊資料file存放、讀取跟寫入。


資料流是什麼?
資料流就是例如我們鍵盤打cin >> apple到C++程式中,表示鍵盤輸入的會儲存進apple裡。
從程式輸出資料 >> 到螢幕,從鍵盤輸入 >> 到程式中。
還記得到現在所有範例的檔案最上頭都有一行#include<iostream>嘛?這個就是表示支持輸出輸入的意思。

檔案可以運作文字檔案或是二進制檔案,除了字元以外的檔案所有資料都是二進位檔案喔,例如圖片、影片和其他的資料,這邊是以輸入文字.txt檔案做示範。

如何開啟一個檔案

必須包含header檔案: <fstream>

  • fstream 可以讀寫

  • ifstream 只能

  • ostream 只能

然後後面加上file object,這個是為著等等要跟我們真正想開啟的檔案做連結,

fstream randomName;  //這個是file object

上面這樣表示可以讀寫


定義完之後要來決定,給檔案什麼模式開啟。
有兩種常用模式:

  • ios::in --> ”只能讀“模式開啟檔案
  • ios::out --> ”只能寫“模式開啟檔案
    fstream randomName;  //這個是file object 
    randomName.open("filename.txt", ios::out); //連結,

上面表示randomNAme這個object是可以讀寫的,但現在連結到filename.txt是以“只能寫模式”開啟檔案。

想要同時開啟讀寫功能可以:

randomName.open("filename.txt", ios::in | ios::out);

各種不同的開啟模式:

  • ios::in 打開只可以讀文件,如果沒有這個檔案的話會bug,沒有東西沒辦法讀嘛。
  • ios::out 打開只可以寫入文件,如果已經有檔案會覆蓋掉已有的內容,如果沒有會生成一個新的。
  • ios::app 在“最後一行寫入”,若沒有檔案會自動生成一個新的。
  • ios::binary 以二進位開啟檔案。

開始輸入資料

  1. 重要:必須檢查檔案是否開啟再做讀寫動作。

  2. 用 << 來輸入資料,例如:myfile << 998; //998被寫入myfile中
if(!randomName.is_open()){
    cout << "Error" << endl;
}else {
    randomName << “白日依山盡” << endl;
    randomName << “黃河入海流” << endl;
}
    randomeName.close(); //關閉randomName檔案

最後!
養成好習慣隨手關檔案,為什麼呢?避免開啟太多檔案系統當掉。

引用CSDN:
当程序向输出设备中输出数据时,输出的数据先被存放在计算机缓冲区(Buffer)内。当缓冲区存满时,这些数据才真正地输出到输出设备。但是,如果输出的字符序列中出现了endl控制符,那么缓冲区内的所有数据将立即输出到输出设备,而无论缓冲区是否已经存满。因此,endl的作用将光标移动到输出设备中下一行开头处,并且清空缓冲区。
————————————————
版权声明:本文为CSDN博主「Jaster_wisdom」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Jaster_wisdom/article/details/52400059

讀取 aka顯示到螢幕

之前Day03C++資料輸入講到
不同的輸入,

以下是以上方法做的ASCII轉換器範例:
之前也做過一個幼幼版的,請參考Day04 - C++好簡單之來寫一個ASCII轉換器吧!基本輸入/輸出Input/Output應用

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int main() {
//    
    
    fstream myFile;
    myFile.open("ASCII.txt", ios::out); //從鍵盤寫入到程式模式
    if(myFile.is_open()){
        myFile << "99 97 114\n";
        myFile << "97 112 112 108 101\n";
        myFile.close();
    }
    myFile.open("ASCII.txt", ios::in); //從程式輸出到螢幕模式
    int line; 
    if(myFile.is_open()){
        while(myFile >> line){
            cout << char(line);
            cout <<" ";
        }
    myFile.close();
    }
}

Reference: CodeBeauty(Youtube), CSDM, stackOverflow


上一篇
Day18 C++物件導向5 - Encapsulation封裝
下一篇
Day 20 C++ 物件導向6 - 繼承 Inheritance
系列文
C++超級菜鳥也可以懂的物件導向攻略30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言