Проблема с fstream :: tellg () и :: seekg ()

РЕДАКТИРОВАТЬ

Решение существует — открытие файла с помощью 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 символов дальше от последнего разрыва строки.

Что на земле может вызвать это?

-1

Решение

Любой хороший diff Программа покажет вам разные блоки. Затем вы можете загрузить результат в графическую программу сравнения, просмотреть результаты визуально, игнорировать блоки, которые вы знать отличаются, затем кричите, когда вы попали в блок, который вы не ожидали.

Например, WinMerge:

http://www.majorgeeks.com/index.php?ct=files&Действие = файл&ID = 1668

2

Другие решения

(и да, относительные запросы не должны работать с файлами, открытыми в текстовом режиме)
Cubbi

Таким образом, есть ответ — открытие в std :: ios :: binary режиме исправляет проблему.

0

По вопросам рекламы [email protected]