Что случилось с тех пор, как я начал регистрировать детали своего файла? - PullRequest
0 голосов
/ 13 января 2012

У меня проблема с программой, которую я написал на c ++ в окне 7 с использованием C :: B. Вот код, который я использовал для проверки количества строк в файле. Первая часть - это объявление функции 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 голосов
/ 14 января 2012

Глядя на этот код, я вижу, что ваш журнал просто открывается с помощью append.Так что со временем это станет довольно большим.

Я не могу сказать, что нет другой причины, по которой этот код не будет работать, но файл размером более 2 ГБ, безусловно, может справиться с задачей.Я не помню, если у режима добавления есть проблемы с этим, но внутренне это может использовать поиск.Seek определенно имеет проблемы с большими файлами.В Linux вы бы использовали семейство функций fseek64.Windows имеет свои собственные версии с подчеркиванием бородавок из-за несовместимости.

Когда вы работаете с потоками, вы должны также проверить ее флаги ошибок, на самом деле она не выдаст, когда что-то пойдет не так.Вы проверяете после открытия, но другие операции также могут потерпеть неудачу.

Более конкретно, звонок на std::istream::ignore.Ваш GotoLine не проверяет eof.С точки зрения дизайна, я бы с подозрением отнесся к этому.Это может работать, но это, конечно, не должно проходить проверку кода.

Как ничтожество, ошибки должны быть напечатаны в std::cerr и возвращать 1.:)

...