我在使用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();
答案 0 :(得分:0)
查看此代码,我看到您的日志只是通过追加打开。所以最终它会变得非常大。
我不能说没有其他原因导致此代码失败,但是大于2gb的文件肯定可以做到这一点。我不记得追加模式是否有问题,但在内部它可能使用搜索。寻求绝对有大文件的问题。在Linux上,您将使用fseek64
系列函数。为了不兼容,Windows有自己的带有下划线疣的版本。
当您使用流时,您应该检查其错误标志,当出现问题时它实际上不会抛出。您在打开后检查,但其他操作也可能失败。
更具体地说,是对std::istream::ignore
的号召。您的GotoLine
未检查eof。从设计的角度来看,我会对此非常怀疑。它可能有用,但肯定不应该通过代码审查。
作为挑剔者,错误应打印到std::cerr
并返回1.:)