自从我开始记录有关文件的详细信息后发生了什么

时间:2012-01-13 17:09:08

标签: c++ windows codeblocks

我在使用C :: B在Windows 7的c ++中编写的程序出了问题。这是我用来检查文件中行​​数的代码。第一部分是gotoline函数的声明,后面是代码的一部分,我计算文件中的行数。在我开始添加日志记录过程之前,一切正常。也许我记录信息错误或者在单个函数中打开和关闭太多文件?任何帮助识别我的错误将不胜感激,我很乐意提供更多关于我的问题的细节或澄清,只要问。我还在学习c ++,所以我很困惑为什么我的程序停止计算行数。

std::ifstream& GotoLine(std::ifstream& file, unsigned int num)
{
file.seekg(std::ios::beg);
for(int i=0; i < num - 1; ++i)
{
    file.ignore(std::numeric_limits<std::streamsize>::max(),'\n');
}
return file;
}


ifstream productguide;

   productguide.open ("MasterProductGuide.csv");

   if (productguide.good())
   {

        c = productguide.get();
        if (c=='\n')x++;

        ofstream log;
        log.open ("log.txt", ofstream::app);

        if (log.good())
        {
            time_t rawtime;
            struct tm * timeinfo;
            time ( &rawtime );
            timeinfo = localtime ( &rawtime );
            string loginfo;
            loginfo = asctime (timeinfo);
            log << "MarketManager Detected " << x << " # of lines in the Master Product Guide - " + loginfo;
        }
        else
        {
            cout << "There was an error creating the log file" << endl;
            cout << "The Program will now terminate" << endl;
            system("PAUSE");
            return 0;
        }
        log.close();

   }
   else
   {
        ofstream log;
        log.open ("log.txt", ofstream::app);

        if (log.good())
        {
            time_t rawtime;
            struct tm * timeinfo;
            time ( &rawtime );
            timeinfo = localtime ( &rawtime );
            string loginfo;
            loginfo = asctime (timeinfo);
            log << "MarketManager Failed to oped the Master Product Guide - " + loginfo;
        }
        else
        {
            cout << "There was an error creating the log file" << endl;
            cout << "The Program will now terminate" << endl;
            system("PAUSE");
            return 0;
        }
        log.close();

        cout << "The Program will now terminate" << endl;
        system("PAUSE");
        return 0;
   }

   productguide.close();

1 个答案:

答案 0 :(得分:0)

查看此代码,我看到您的日志只是通过追加打开。所以最终它会变得非常大。

我不能说没有其他原因导致此代码失败,但是大于2gb的文件肯定可以做到这一点。我不记得追加模式是否有问题,但在内部它可能使用搜索。寻求绝对有大文件的问题。在Linux上,您将使用fseek64系列函数。为了不兼容,Windows有自己的带有下划线疣的版本。

当您使用流时,您应该检查其错误标志,当出现问题时它实际上不会抛出。您在打开后检查,但其他操作也可能失败。

更具体地说,是对std::istream::ignore的号召。您的GotoLine未检查eof。从设计的角度来看,我会对此非常怀疑。它可能有用,但肯定不应该通过代码审查。

作为挑剔者,错误应打印到std::cerr并返回1.:)