Pages

2012年2月28日 星期二

[C++] 各種文字檔的讀取方法整理

我將各種文字檔的讀取方式做整理,有想到其他的再補上來。
我寫過的作業裡,測試資料分為:
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
            ...
同一系列的資料在同一行,我會立刻用getline:

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
3.    遇到文字檔案內的資料不是以空白區隔,而是以其他符號區隔(例如逗號),此時可以使用我之前文章所寫的方法,使用getline:

      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;
      }
4.     stringstream、istringstream、ostringstream使用上的差別:
假設建立一個 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內部存的資料。

2012年2月27日 星期一

[演算法] Stupid Sort

    新的學期開學了,這學期修了高等演算法的課程,將之前學過的演算法整理複習一遍,並學更多演算法的應用。
Stupid Sort   
Stupid Sort的排序過程,雖然可視為比人類自己排序還慢,然而這種演算法的好處,是當電腦執行到一半因為某種緣故中斷執行程序後,下次要啟動排序流程時,可以直接從上一次排序到一半的那個狀態繼續執行下去,而不需要再輸入每筆資料重頭開始排序,因此在實際應用上,這種Stupid演算法有它的好處。
Stupid Sort程式碼很短,我將Stupid Sort用C++寫出來,函式如下:
void StupidSort()
{
    int i = 0;
    while(i<(size-1))
    {
           if(data[i] > data[i+1])
          {
                 int tmp = data[i];
                data[i] = data[i+1];
                data[i+1] = tmp;
                i = 0;
          }
          else
         {
               i++;
         }
     }
}
這就是我這學期寫的第一個程式,希望這學期能學到很多東西。