C - записать в файл количество вхождений символа - PullRequest
0 голосов
/ 19 октября 2019

Я пишу функцию кодирования, которая берет дескриптор файла из исходного файла и ФАЙЛ * в качестве файла назначения. Если входной файл имеет это: 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;                                                                 
}         

1 Ответ

0 голосов
/ 19 октября 2019
        if (count == 0)                                                     
        {                                                                   
            previous = buffer[i];                                           
            count += 1;                                                     
        }                                                                   
        if (count != 0)                                                     
        {                                                                   
            if (previous == buffer[i])                                      
            {                                                               
                count += 1;                                                 
            }      

Когда count == 0, то count = 1. Затем вы проверяете count != 0, потому что вы только что сделали count += 1, потому что count было 0. Затем if (previous == buffer[i]), что также всегда будет истинно, потому что вы только что сделали previous = buffer[i] в первом случае if. Затем вы снова увеличиваете счет.

Я думаю, что вы пропустили еще:

        if (count == 0)                                                     
        {                                                                   
            previous = buffer[i];                                           
            count += 1;                                                     
        } else                                                      
        if (count != 0)                                                     
        {                                                                   
            if (previous == buffer[i])                                      
            {                                                               
                count += 1;                                                 
            }      

Примечания:

  • Я думаю, что вы смешиваете fgets с read звонки. buffer[c] = '\0'; не требуется, вызов read просто читает байты из файловых дескрипторов, какими бы они ни были, и если c будет слишком ошибочным для buffer, это будет выход за пределы допустимого диапазона.
  • Вы не печатаете счетчик последнего символа файла. Так получилось, что ваш файл заканчивается новой строкой - previous устанавливается на новую строку при последнем выполнении вашего цикла. Если ваш файл не оканчивается символом w новой строки, счетчик последнего символа не будет напечатан.
...