РЕДАКТИРОВАТЬ
Решение существует — открытие файла с помощью std :: ios :: binary вместо текстового режима (несмотря на то, что файл является чистым текстом) решает проблему. Tellg () теперь сообщает о правильном местоположении, поэтому теперь можно использовать seekg (), чтобы вернуться в то же место.
КОНЕЦ РЕДАКТИРОВАНИЯ
Некоторое время назад у нас была проблема с сервером. С первичным сервером все в порядке, но у вторичного произошел небольшой сбой. Мы хотим знать, было ли что-то зарегистрировано по-другому за это время.
Мы точно знаем, что есть Другой различия между файлами журналов — они имеют разную длину из-за того, что регистрация происходила, когда один или другой был отключен ранее. Таким образом, мы не можем выполнить прямое построчное сравнение — мы можем получить тысячи строк, которые, как сообщается, будут зарегистрированы по-разному, но просто будут компенсированы двумя дополнительными линиями, зарегистрированными одним из серверов в верхней части, без регистрации другой.
Я пишу программу для сравнения выходных текстовых файлов на основе их отметок времени; то есть, перейдите к области вокруг отметки времени, где произошел сбой, и построчно сравните только для этой области. Вот где возникает проблема с Tellg () и seekg ().
Во-первых, этот цикл выполняется для обоих файлов журнала:
while( getline(inputFile, inputLine) && loopBreak != 1 && inputFile.good() ){
if (firstOpen.empty()){
if ( -1 != inputLine.find("TimeOfFirstEntry") ){
firstOpen = inputLine;
}
}
if (!firstOpen.empty() && lastOpen.empty()){
if ( -1 != inputLine.find("TimeOfLastEntry") ){
lastOpen = inputLine;
}
}
if (!firstOpen.empty() && !lastOpen.empty()){
if ( -1 != inputLine.find(timeStamp) ){
if (0 == firstLineInBucket){
firstLineInBucket = inputFile.tellg();
lastLineInBucket = inputFile.tellg();
}
else{
lastLineInBucket = inputFile.tellg();
}
}
if ( (0 != firstLineInBucket) && (0 != lastLineInBucket) ){
if ( (-1 != inputLine.find("OccuranceTime") ) && (-1 == inputLine.find(timeStamp)) ){
loopBreak = 1;
}
}
}
}
Позже этот цикл выполняет сравнение:
if(inputPrimary.good() && inputSecondary.good() && output.good()){
inputPrimary.seekg(Primary.getFirstBucket());
inputSecondary.seekg(Secondary.getFirstBucket());
std::string linePrimary;
std::string lineSecondary;
while( getline(inputPrimary, linePrimary)
&& getline(inputSecondary, lineSecondary)
&& (inputPrimary.tellg() < Primary.getLastBucket())
&& (inputSecondary.tellg() < Secondary.getLastBucket()) ){
if(linePrimary == lineSecondary){
//Do nothing
}
else{
output << linePrimary << " .:|:. " << lineSecondary << "\n";
}
}
inputPrimary.close();
inputSecondary.close();
output.close();
}
Вот где все становится странным: когда я проверил это по паре файлов для отметки времени, которая известна как хорошая (то есть они имеют одинаковое содержимое для этой отметки времени), содержимое было записано в выходной файл. Дальнейшее расследование показывает, что записанная строка, как сообщалось, отличается в двух файлах, потому что для файла журнала вторичных серверов операция seekg () помещает позицию в начало строки, а для файла журнала первичных серверов — seekg Операция () помещает позицию на ~ 11 символов дальше от последнего разрыва строки.
Что на земле может вызвать это?
Любой хороший diff
Программа покажет вам разные блоки. Затем вы можете загрузить результат в графическую программу сравнения, просмотреть результаты визуально, игнорировать блоки, которые вы знать отличаются, затем кричите, когда вы попали в блок, который вы не ожидали.
Например, WinMerge:
http://www.majorgeeks.com/index.php?ct=files&Действие = файл&ID = 1668
(и да, относительные запросы не должны работать с файлами, открытыми в текстовом режиме)
—Cubbi
Таким образом, есть ответ — открытие в std :: ios :: binary режиме исправляет проблему.