Independent Dog

My EDA life record

檔案讀取寫入教學

檔案讀取教學

如果將要讀取的檔案名稱存在程式裡,每次要執行新的檔案時都要重新complier一次。檔案還小時還不打緊但當檔案數目到了一定數量後曠日廢時的編譯時間會令使用者抓狂所以好的讀檔方式是在程式設計中不可或缺的一環。

在Linux 的terminal 上執行程式我們會使用./語法 如:./file < input_name > < ouput_name >。將要讀取之檔案名稱以及輸出之檔案位址加在後頭是個不錯的方法。具體實作上我們會使用到argc,argv[]這兩個參數。

在上面的範例中,argc 是輸入的指令總數 file input_name ouput_name 總共有三個參數,所以argc是3。argv則是一個字串陣列,每一個陣列中的元素代表著輸入的字串。以上題為例:argv[1]會是 input_name, argv[2]則會是 ouput_name。

使用範例:

1
2
3
4
5
#include <iostream>
int main(int argc, char* argv[])
{
}

讀檔&寫檔

本節部討論詳細物件之間的關係僅提供新手快速上手以及作者查閱方便之用,此外實驗室serveru有作者當初留下來的範本。

在C++中會引用fstream 這個head file ,fstream其中的ifstream, ofstream, fstream物件 可以幫助我們完成讀檔寫檔案的工作(看不懂表示你物件導向很爛需要重修 ╮( ̄▽ ̄””)╭)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <fstream>
#include <vector>
using namespace std;
int main(int argc, char* argv[])
{
vector<char> arr;
char reg;
// Template1
// //////////////////////////////////
fstream FILEIN,FILEOUT;
FILEIN.open(argv[1],ios::in);
if(FILEIN.good())
cout <<"Open Succes\n";
else
cout <<"Open File\n";
while(!FILEIN.eof())
{
FILEIN >> reg;
arr.push_back(reg);
}
FILEIN.close();
FILEOUT.open(argv[2],ios::out);
if(FILEIN.good())
cout <<"Output Succes\n";
else
cout <<"Output File\n";
for(auto &x:arr)
FILEOUT << x;
FILEOUT.close();
//Template2
/////////////////////////////////////////
ifstream FILEIN(argv[1], ios::out);
if(FILEIN)
cout <<"Open Succes\n";
else
cout <<"Open File\n";
while(FILEIN >> reg){
arr.push_back(reg);
}
FILEIN.close();
ofstream FILEOUT(argv[2], ios::in);
if(FILEOUT)
cout <<"Open Succes\n";
else
cout <<"Open File\n";
for(auto &x:arr)
{
FILEOUT << x;
}
FILEOUT.close();
}

ios部分為C++的讀檔參數,如果有不懂的可以直接上cplusplus.com查詢其中有相當詳細的解釋,在此不做贅述。
在檔案處理的部分強烈建議使用者不要將C和C++語法混用,會有預期外指標丟失的問題EX:在fopen這個C檔案處理的function中使用cout,cin 筆者一開始沒概念的情況下常常隨意混用導致檔案輸出異常以及終端機輸出異常的狀況。

⬅️ Go back