Я пишу функцию кодирования, которая берет дескриптор файла из исходного файла и ФАЙЛ * в качестве файла назначения. Если входной файл имеет это: AABBBcccc
, тогда я должен написать 2A3B4c
в выходной файл. (номер одного и того же последовательного символа). Мне удалось это сделать, но моя единственная проблема в том, что число вхождений для первой буквы равно +1 ... Поэтому я получу: 3A3B4c
. Функция возвращает общее количество символов, записанных в outt.
int encode_aux(int fd1, char *buffer, FILE *outt)
{
size_t c = read(fd1, buffer, sizeof(buffer) - 1);
char previous; //to check if the next character is the same
int count = 0; //number of occurence of the same character
int total = 0; //total number of chars written in the output file
while (c != 0)
{
for (size_t i = 0; i < c; i++)
{
if (count == 0)
{
previous = buffer[i];
count += 1;
}
if (count != 0)
{
if (previous == buffer[i])
{
count += 1;
}
else
{
if (i == 0)
{
count -= 1;
}
if (count != 1)
{
total += fprintf(outt, "%d", count);
}
total += fprintf(outt, "%c", previous);
previous = buffer[i];
count = 1;
}
}
}
buffer[c] = '\0';
c = read(fd1, buffer, sizeof(buffer) - 1);
}
return total;
}
int encode(const char *file_in, const char *file_out)
{
FILE *out = fopen(file_out, "w");
char buff[4096];
int fd = open(file_in, O_RDONLY);
if (fd == -1 || out == NULL)
{
return -1;
}
int tot = encode_aux(fd, buff, out);
if (close(fd) == -1 || fclose(out) != 0)
{
return -1;
}
return tot;
}