題目:

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

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

Aabbc
Apple123

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

5Aabbc
8Apple123

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

解法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#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 的標頭檔,並先”定義”欲使用來寫入寫出的文字,如下示範:

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

再來是檔案開啟的部分

第二部分:主功能解析

在標頭檔的部分

1
2
3
#include<iostream>
#include<fstream>
#include<cstring>

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

而主要程式區塊內

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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
紅色圈中可以看到檔案成功生成,在字串部分也有在最前端顯示出每行字數數值!

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

參考資料:

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