iT邦幫忙

2022 iThome 鐵人賽

DAY 11
0
自我挑戰組

C++30日挑戰之旅系列 第 11

DAY11 用c++來讀取/寫入檔案

  • 分享至 

  • xImage
  •  

題目:

請開啟in檔,並讀取每一行文字,並在文字前加上這一行的長度,然後寫到out檔,重複以上動作直到讀不到任何正文字為止

輸入 (讀取檔案: in,內容為n行英文且一定要跳行),例如
檔名:in

Aabbc
Apple123

輸出 (寫入檔案: out,在文字前加上這一行的長度),例如
檔名:out

5Aabbc
8Apple123

一行長度不會超過70,並運用 strlen函數。


解法

#include<iostream>
#include<fstream>
#include<cstring>

using namespace std;

int main()
{
  ifstream inStream;//讀取定義
  ofstream outStream;//寫入定義
  
  inStream.open("in");
  outStream.open("out");
  char n[70];
  int length;
  while(inStream>>n)
  {
    length=strlen(n);
    outStream<<length<<n<<endl;
  }
  
  inStream.close();
  outStream.close();
}

解釋與詳細介紹

第一部分:fstream介紹

fstream標頭檔裡包含了ifstream(檔案寫入)和ofstream(檔案寫出),他是以檔案層級進行寫入寫出(類似cin/cout的輸入輸出,但是以檔案的方式進行)。在使用上,需要先#include <fstream>的標頭檔,並先"定義"欲使用來寫入寫出的文字,如下示範:

 ifstream in;
 ofstream out;
    string a,b; // 有a,b兩字串變數
    in >> a >> b;//寫入a,b

再來是檔案開啟的部分

第二部分:主功能解析

在標頭檔的部分

#include<iostream>
#include<fstream>
#include<cstring>

除了iostream的部分,我們多引入了fstream(ifstream/ofstream)和cstring(因為需要用到計算字數的函式,strlen())

而主要程式區塊內

int main()
{
  ifstream inStream;//讀取定義
  ofstream outStream;//寫入定義
  
  inStream.open("in");
  outStream.open("out");
  char n[70];
  int length;
  while(inStream>>n)
  {
    length=strlen(n);
    outStream<<length<<n<<endl;
  }
  
  inStream.close();
  outStream.close();
}

我們先定義了檔案讀取為"inStream"寫入為"outStream"(可自己命名),並開啟檔案"in",這是我們會先放在跟程式檔同層級資料夾的txt檔案。程式部分運用inStream.open("已存在欲讀取檔案名")的方式讀取檔案(這裡是in檔),並用outStream.open("未存在欲寫入檔案名")的方式先創建一個欲寫入的檔案與欲為其命名名稱(這裡是out檔)。

再來先創建一個大小為70的字串陣列(應題目要求一行不超過七十字),並用while迴圈的方式(會不斷執行小括號內的條件直到結束),先用length變數存取該行的字數,也就是用strlen(欲計算的字串)計算每一行的字串數量值。再用outStream的方式寫入out檔內,先寫入的會在檔案內較前面的位置(較左)。

最後再將有用到的inStream()與outStream()以.close()的方式結束就可以了!

第三部分:成果展示

同層級資料夾內的in.txt:
https://ithelp.ithome.com.tw/upload/images/20220912/20151593mXupsUy82R.png

當程式執行完後自動出現的out.txt:
https://ithelp.ithome.com.tw/upload/images/20220912/20151593ZlDRAcrgp8.png
紅色圈中可以看到檔案成功生成,在字串部分也有在最前端顯示出每行字數數值!

用程式的方式創建與寫入檔案是不是十分新奇呢?那我們明天見!


參考資料:

  1. https://hackmd.io/@ndhu-programming-2021/BkZukG4jK

上一篇
DAY10 利用陣列(Array)輸出亂數們的統計數值
下一篇
DAY12 比對檔案的技巧(上)
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言