2014-12-19 130 views
0

所以寫榆樹和getfileID功能所需要的文件 在光標POS(寫榆樹追加到末尾,getFileID打印行第一個到最後)應該多久一個打開/關閉fstream的對象C++

#ifndef file_operations_header 
    #define file_operations_header 
    #include <string> 
    #include <iostream> 
    #include <vector> 
    #include <fstream> 
    #include "First_classes_header.h" 


    class fileOPerations 
    { 
    private: 
     string line; 
     fstream f_myFileOut; 
    public: 
     fileOPerations(); 

     void closeFile() 
     { 
      f_myFileOut.close(); 
     } 

     int getFileID() 
     { 
      int counter = 0; 
      if (f_myFileOut.is_open()) 
      { 
       while(f_myFileOut.good()){ 
        getline(f_myFileOut,line); 
        ++counter; 
        cout << line << endl; 
        } 
      }f_myFileOut.close(); 
      return counter; 
     } 



     int writeElm(makeVector& mV,int i) 
     { 
      f_myFileOut.open("file.txt",ios::out|ios::app|ios::ate); 
      if (f_myFileOut.is_open()) 
      { 
       f_myFileOut << mV.str_vector[i].counter << "\t"; 
       f_myFileOut << mV.str_vector[i].name << endl; 
      } 
      else{ 
       cout << "can't open file." << endl; 
      } 
      return 0; 
     } 


     friend class makeVector; 
    }; 

    fileOPerations::fileOPerations():f_myFileOut("file.txt",ios::out|ios::app|ios::in){} 

    #endif // file_operations_header 

並且在我的main中調用getFileID不會打印任何內容,因爲writeElm() 將光標pos設置爲文件末尾。

 #include <iostream> 
     #include <string.h> 
     #include <vector> 
     #include "First_classes_header.h" 
     #include "file_operations.h" 
     using namespace std; 



     int main() 
     { 
      fileOPerations fpObject; 
      makeVector vecObject; 

      int fileID = fpObject.getFileID(); 

      while(true){ 
       IDgenerator(); 

       int genID = IDgenerator::GetID(); 
       int currentID = fileID + genID; 
       string workingName = nameGetter::setName(); 


       vecObject.vecSetter(currentID,workingName); 
       fpObject.writeElm(vecObject, currentID); // error within this function 

       fpObject.getFileID(); 

      }fpObject.closeFile(); 


      return 0; 

     } 

它是安全/ effecient /有效調用f_myFileOut.open()使用不同的參數 在每個單獨的功能?

 int getFileID() 
     { 
      f_myFileOut.open(("file.txt",ios::out|ios::app|ios::in) 

      int counter = 0; 
      ... 

...

int writeElm(makeVector& mV,int i) 
    { 
     f_myFileOut.open("file.txt",ios::out|ios::app|ios::ate); 

或者我應該手動設置光標POS?

+1

你爲什麼試圖在這個開發階段優化你的軟件?還有更多,你爲什麼試圖將注意力集中在文件的I/O優化上?無論如何,那部分會很慢。只要讓它工作,在程序運行平穩之後,重構它並開始使用探查器或類似工具優化真正的瓶頸。 – Raistmaj 2014-12-19 06:33:36

回答

1

雖然它肯定效率不高,但一次又一次地打開/關閉同一個文件,這將是安全的,我甚至稱它爲更好的編碼風格,因爲目前您正在使用一種方法打開文件,並且關閉它在另一個,並在這兩種情況下,從功能名稱不明顯,這是他們的副作用之一(例如closeFile())。此外,您已經在每次迭代中打開/關閉文件,因此這將「僅」打開/關閉操作的兩倍。但是,一般來說,我最好建議在程序開始時打開一次文件,最後關閉它,例如,之間使用f_myFileOut.seekg (0,f_myFileOut.beg)f_myFileOut.seekg (0,f_myFileOut.end),以移動您的迭代器。

相關問題