我寫過的作業裡,測試資料分為:
1. 文字檔案裡面第一行代表資料個數,第二行是資料的內容,例如假設要做資料排序:
5 6 7 1 3 5 3 11 7 3 |
第一行的5代表下一行將會有五個數字,然後第二行給予5個數字請程式來排序。接著第三行的3代表有三個數字,並在第四行給予這三個數字的值給程式來排序。
我讀取這樣的文字檔通常直接使用ifstream直接將資料推入int型態的變數:
int size = 0; int *data = NULL; ifstream inputFile(“input.txt”); while(inputFile >> size) { data = new int[size]; for(int i=0;i<size;i++) { inputFile >> data[i]; } //在這裡對data陣列做想要的operation. delete[] data; data = 0; } |
這是屬於同一系列的資料被分為許多行的情況。
2. 文字檔中同一系列的資料在同一行,例如:
2 3 9 5 11 3 6 5 4 0 7 2 ... |
void readData() { ifstream inputFile; inputFile.open("input.txt",ifstream::in); string line; int lineNumber = 0; data = new int[size]; while(getline(inputFile,line)) { lineNumber++; istringstream token(line); int key; while(token >> key) { //在這裡對token做處理。 } } } //ok |
string str = "19 82 37 55 167"; stringstream stream1(str); string token; while(1) { getline(stream1, token, ' '); //指定用空白隔開, //可指定其他分隔字元 if (stream1.fail()) break; istringstream forInt(token); int tmp = 0; forInt >> tmp; cout << tmp << endl; } |
假設建立一個 istringstream變數 iss,則可以把一個string字串塞給stream1,然後這個 iss 就可以把那個字串裡的東西再轉換給其他型態的變數,例如int或者float等等,像上面第3點的範例就是一個字串轉換成整數的例子。
要將字串str塞給 iss,方法有:
istringstream iss(str);
或者
istringstream iss;
iss.str(str);
簡單說就是字串--->送給istringstream--->送給其他型態的小變數。
同理,若有一個ostringstream型態的變數叫做oss,則可以將字串或者int等型態變數一直塞給oss,然後再一次將oss裡的東西設給一個新的字串。例如:
string str = “test”;
ostringstream oss;
oss << 2 << str;
str = oss.str();
亦即各種型態的小變數--->送給ostringstream--->結合起來設給一個string。而stringstream則是兼具istringstream跟ostringstream的輸入及輸出功能。
另外stringstream、istringstream、ostringstream都具有clear()函式,可以清除error的狀態,也可以清空整個stream內部存的資料。