廢話不多說,先講C++一般如何創建二維數組的,這種方法是裡面填什麼數都可以,動態的。
[cpp]
int **M=new int*[hang]; //初始化行
for(int i=0;i<hang;i++)
{
M[i]=new int[lie];//初始化列,到了這裡已經成功初始化數組了
for(int j=0;j<lie;j++)//這裡開始給二維數組的每一個賦值
{
cin>>M[i][j];
}
}
上面就是這麼一個過程,當然初值的賦值不一定要自己在命令行模式下輸入。可以利用文件的方式,來輸入。
下面介紹文件的輸入輸出操作。
基礎知識:文件操作流 fstream 有兩個子類:ifstream 和 ofstream ,ifstream默認以輸入方式打開文件,而ofstream默認以輸出方式打開文件。不過我們可以在構造的時候添加打開的模式(mode),也可以先
1、先說ofstream把程序(內存)裡面的東西輸出到文件(輔存)吧。
[cpp]
ofstream outfile("DATA.txt");
if(!outfile)return -1;
outfile<<"hello file!"; www.2cto.com
輸出到文件,輸出文件的目錄是你的C源程序的目錄。當然你也可以用下面那種方式輸出:
[cpp]
ofstream outfile;
outfile.open("DATA.txt");
if(!outfile)return -1;
outfile<<"hello file!";
如果你想輸出文件到一個絕對地址,例如D盤目錄下,你把那個 DATA.txt 改為 D:\\DATA.txt ,記住是兩個斜槓啊。前面一個是轉義用的。如果你想把默認的輸出方式改變,你可以利用下面的模式,來改變。
ios::in 打開一個輸入文件,用這個標志作為ifstream的打開方式,以防止截斷一個現成的文件
ios::out 打開一個輸出文件,當用於一個沒有ios::app、ios::ate或ios::in的ofstream時,ios::trunc被隱含
ios::app 以追加的方式打開一個輸出文件
ios::ate 打開一現成文件(不論是輸入還是輸出)並尋找末尾
ios::nocreate 僅打開一個存在的文件(否則失敗)
ios::noreplace 僅打開一個不存在的文件(否則失敗)
ios::trunc 如果一個文件存在,打開它並刪除舊的文件
ios::binary 打開一個二進制文件,缺省的是文本文件
上面是從C/C++的一些庫裡面找到的,下面再給出一些。
ios::in = 0x01, //供讀,文件不存在則創建(ifstream默認的打開方式)
ios::out = 0x02, //供寫,文件不存在則創建,若文件已存在則清空原內容(ofstream默認的打開方式)
ios::ate = 0x04, //文件打開時,指針在文件最後。可改變指針的位置,常和in、out聯合使用
ios::app = 0x08, //供寫,文件不存在則創建,若文件已存在則在原文件內容後寫入新的內容,指針位置總在最後
ios::trunc = 0x10, //在讀寫前先將文件長度截斷為0(默認)
ios::nocreate = 0x20, //文件不存在時產生錯誤,常和in或app聯合使用
ios::noreplace = 0x40, //文件存在時產生錯誤,常和out聯合使用
ios::binary = 0x80 //二進制格式文件
無論構造,還是open,後面都可以加模式選擇。以構造器為例:
[cpp]
ofstream outfile("DATA.txt",ios::out|ios::trunc);
用了兩種模式,要知道其實這兩種模式就是兩個8位數,通過“位或”可以把他們連起來用。
使用完畢,要關閉文件,outfile .close() 就可以了。
2、再說用ifstream把文件(輔存)裡面的東西輸入到程序(內存)裡面吧。
下面是一個 DATA.txt 的文件內容:
[plain]
hello file!
Hi David!
寫了三行。然後通過下面程序,就可以把這東西輸出到屏幕:
[cpp]
int main()
{
string s;
ifstream infile("DATA.txt",ios::in);
if(!infile)return -1;
while(infile)
{
//istream& getline ( istream& is, string& str ); std裡面的
getline(infile,s);//Get line from stream
cout<<s<<endl;
}
infile.close();
}
輸出結果是:
[plain]
hello file!
Hi David!
請按任意鍵繼續. . .
下面把DATA.txt改一下,解決我們文章一開始提到過的問題,不用命令行模式輸入數據,用文本方式。下面是DATA.txt內容:
[plain]
12 33 44
22 463 93
63 48 9
好,下面寫程序,把文件裡面的東西傳進數組裡面。然後屏幕輸出。
[cpp]
#include<iostream>
#include<fstream>
#include<iomanip> // 因為使用了setw()語句,設置位寬的。
using namespace std;
int main()
{
int num=3; //這個num自己也可以到控制台輸入,程序現在不打算弄這個功能。
int **M=new int*[num]; //初始化行
ifstream infile("DATA.txt",ios::in);//初始化文件操作
if(!infile)return -1;//創建失敗就返回錯誤
for(int i=0;i<num;i++)
{
M[i]=new int[num];//初始化列,到了這裡已經成功初始化數組了
for(int j=0;j<3;j++)//這裡開始給二維數組的每一個賦值
{
if(infile) infile>>M[i][j];//infile中讀取數值,有空格就停,游標一直往下走下去
cout<<setw(5)<<M[i][j]; //設置位寬為5,輸出到屏幕
}
cout<<endl; // 輸出一行後換行
}
infile.close(); //關閉文件
}
輸出結果:
[plain]
12 33 44
22 463 93
63 48 9
意鍵繼續. . .
上面是一個格式化的輸出哦~~位寬一定,為5,好看多了。這東西你可以再寫進文件裡面,哈哈~~