Как можно вернуть указатель в потоке назад на один символ?
Пытаюсь реализовать алгоритм LZW на С. У меня есть текстовый файл, который я читаю в цикле while:
while ((currentCharCode = fgetc(inFile)) != EOF ){
// формируем суффикс
realloc (sufix.value, 2*sizeof(char));
sufix.value[0] = currentCharCode;
sufix.value[1] = '\0';
sufix.code = currentCharCode;
if (strlen(prefix.value) <= strlen (dictionary[freeCode-1]->value) && inDictionary==1) prefix.value = realloc(prefix.value, strlen(prefix.value) + 2);
if (prefix.value == NULL) prefix.value = strcpy(prefix.value, sufix.value);
// К нашему текущему префиксу добавляем суффикс Теперь слово у нас расширилось на один символ
else prefix.value = strcat (prefix.value, sufix.value);
// Проверяем словарь
for (int i = 0 ; i< freeCode; i++){
// если мы найдем в словаре наш префикс, то коду префикса назначаем соответствующий код из словаря
if (strcmp (prefix.value, dictionary[i]->value) == 0){
prefix.code = dictionary[i]->code;
inDictionary = 1;
// Выходим из цикла проверки, возвращаемся к основному циклу
}
else {
inDictionary = 0;
}
if (inDictionary==0 && i ==freeCode-1){
//Если выполнилось условие проверки, то это значит, что расширенного слова нет в нашем словаре, значит
// выделяем память под слово с первым свободным кодом
dictionary [freeCode] = malloc (sizeof(Word));
// выделяем память под значение нового слова в словаре
dictionary [freeCode]-> value = malloc (strlen(prefix.value) + 1);
// копируем новое слово в словарь
dictionary[freeCode] -> value = strcpy (dictionary [freeCode]->value, prefix.value);
// Назначаем ему код
prefix.code = freeCode;
dictionary[freeCode]->code = prefix.code;
// Мы записали расширенное в словарь
// Выводим в выходной поток код слова, которое есть в словаре
fprintf (outFile, "%d", prefix.code);
// Теперь текущим словом должен стать суффикс расширенного слова
strcpy (prefix.value, sufix.value);
prefix.code = sufix.code;
free (sufix.value);
// и увеличиваю код свободного слова
++freeCode;
inDictionary =1;
}
if (inDictionary == 1 && strcmp(prefix.value, dictionary[i]->value)==0){
realloc (prefix.value, strlen(prefix.value+2));
sufix.value = malloc (2*sizeof(char));
sufix.value[0] = fgetc(inFile);
int lastPosition = ftell(inFile)-1;
sufix.value[1] = '\0';
strcat(prefix.value, sufix.value);
inDictionary =0;
if (ftell (inFile) !=0 && ftell (inFile) !=-1) fseek(inFile, lastPosition, 0);
}
}
}
. В программе мне надо добавить к строке prefix.value следующий символ, а затем вернуть указатель на 1 символ назад. Но из-за строки
if (ftell (inFile) !=0 && ftell (inFile) !=-1) fseek(inFile, lastPosition, 0);
Происходит утечка памяти. Как правильно сместить указатель на назад?
Вот я комментирую строку
if (ftell (inFile) !=0 && ftell (inFile) !=-1) fseek(inFile, lastPosition, 0);
Вывод программы
Убираю комментарий
Точно так же программа ведет себя при использовании fseek(inFile, -1, SEEK_CUR);

