輸入為in檔案(in內容為英文文章),檔案大小為n。利用動態陣列產生一個n的char陣列將in全部內容讀到該陣列
srand(100);//固定使用100為seed
產生50個1~n的亂數,將每一個亂數位置的字元輸出到out
input:in檔內容為英文文章(英文字母&空白&換行)
output:out檔內產生50個1~n的亂數,將每一個亂數位置的字元輸出到out
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;
int main()
{
long begin, end, size;
ifstream file("1.in");
begin = file.tellg();//開頭位置讀數
file.seekg(0, ios::end);//檔案移到最後
end = file.tellg();//最後位置讀數
file.close();
size = (end - begin);//相減為size
ifstream inStream;
ofstream outStream;
inStream.open("1.in");
outStream.open("1.out");
char s;
char *p1;
p1 = new char[size];
for (int i = 0; i < size; i++)
{
inStream.get(s);
p1[i] = s;
}
srand(100);
int x;
for (int j = 0; j < 50;j++)
{
x= rand() % size + 1;
outStream << p1[x-1];
}
inStream.close();
outStream.close();
}
這裡要先介紹一個新的名詞--"pointer(指標)"。他是一個可以儲存"記憶體位址"的變數型態。一般我們的變數是儲存一個對應的代表值,如整數、字串、小數等,而"記憶體位址"可以想像成他在記憶體上的地址,在編譯器翻譯程式後可以藉由最終記憶體上的位址去讓機器執行程式。簡單舉個例子,假設有一個變數n
n的值為10
n的位址為0x61febc
可以看到位址的組成會包含英數字的多位數,平常我們可以用&變數
的方式如:
int n = 10;
cout<<&n;//輸出位址值
而在程式中表示pointer的方式是以*
的方式,呈上題變數n,舉例而言
int *p = &n;
cout << *p;//會輸出10
cout << p;//會輸出0x61febc,用p來做為"位址的變數"(即:指標變數)
而我們在程式中需要指標的原因是因為,我們需要運用它來達成動態分配記憶體。
long begin, end, size;
ifstream file("in");
begin = file.tellg();//開頭位置讀數
file.seekg(0, ios::end);//檔案移到最後
end = file.tellg();//最後位置讀數
file.close();
size = (end - begin);//相減為size
ifstream inStream;
ofstream outStream;
inStream.open("in");
outStream.open("out");
先設定好需要的變數與設定in檔的讀寫,而seekg
和tellg
的部分對inStream的設定,使讀取檔案的頭到尾,且計算出空間值。
char s;
char *p1;
p1 = new char[size];//設置動態記憶體
for (int i = 0; i < size; i++)
{
inStream.get(s);//讀取單個字
p1[i] = s;
}
這裡我們用pointer來令"動態"字元陣列(動態就是不先給予空間值,執行後存入多少算多少記憶體的方法,有助於節省記憶體空間)。動態陣列的列取方式是以new
的方式定義其位址,結合迴圈將大小寫入來定義。
srand(100);
int x;
for (int j = 0; j < 50;j++)//空間為50
{
x= rand() % size + 1;//取文章空間的隨機值
outStream << p1[x-1];//將值輸出到out
}
inStream.close();
outStream.close();
最後再將x設為以in檔空間大小的隨機亂數並輸出到out檔中,並作結尾的close()。
in檔:
文字內容:At X, projects prototype, experiment and iterate to derisk their moonshot technologies and build the foundation for a strong business. When the signals are right, projects move on from the Factory to the next stage of their journey.
out檔:
有沒有覺得用pointer達成動態的儲存方式很神奇呢?那我們明天見~(´,,•ω•,,)