应该多久打开/关闭一个fstream对象c ++

时间:2014-12-19 05:38:41

标签: c++ io fstream

所以write elm和getfileID函数需要文件中的游标pos (写elm附加到最后,getFileID首先打印行)

    #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;

        }

使用不同的参数调用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);

或者我应该手动设置光标位置吗?

1 个答案:

答案 0 :(得分:2)

虽然效率肯定不高,但是一遍又一遍地打开/关闭同一个文件会很安全,我甚至称它为更好的编码风格,因为目前你正在用一种方法打开一个文件并且在另一种情况下将它关闭,并且在两种情况下,从功能名称中不明显这是它们的副作用之一(与例如closeFile()相反)。你也已经在每次迭代中打开/关闭文件,所以这只会&#34;只有&#34;打开/关闭操作加倍。

但一般情况下,我明确建议您在程序开头打开文件一次,最后关闭文件,例如在它们之间使用f_myFileOut.seekg (0,f_myFileOut.beg)f_myFileOut.seekg (0,f_myFileOut.end)来移动迭代器。