【问题标题】:How often should one open/close fstream object c++应该多久打开/关闭 fstream 对象 c++
【发布时间】:2014-12-19 05:38:40
【问题描述】:

所以 write elm 和 getfileID 函数需要文件中的光标位置 (写 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() 将光标位置设置为文件末尾。

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

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

【问题讨论】:

  • 您为什么要在这个开发阶段尝试优化您的软件?甚至更多,您为什么要如此关注文件的 I/O 优化?无论如何,那部分会很慢。让它工作,在程序运行顺利后,重构它并开始使用分析器或类似工具优化真正的瓶颈。

标签: c++ io fstream


【解决方案1】:

虽然它肯定效率不高,但一遍又一遍地打开/关闭同一个文件,这是安全的,我什至称之为更好的编码风格,因为目前您正在以一种方法打开文件并关闭在另一种情况下,在这两种情况下,从函数名称中看不出这是它们的副作用之一(与例如closeFile()相反)。此外,您已经在每次迭代中打开/关闭文件,因此这将“仅”加倍打开/关闭操作。

但是,一般来说,我明确建议在程序开始时打开文件一次,最后关闭它,例如在两者之间使用 f_myFileOut.seekg (0,f_myFileOut.beg)f_myFileOut.seekg (0,f_myFileOut.end) 来移动你的迭代器。

【讨论】:

    猜你喜欢
    • 2011-11-24
    • 2011-09-04
    • 1970-01-01
    • 1970-01-01
    • 2019-06-26
    • 2011-06-19
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    相关资源
    最近更新 更多