Используя очередь переписать содержимое текстового файла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Используя очередь, решить следующую задачу. Содержимое текстового файла f, разделенное на строки, переписать в текстовый файл g, перенося при этом в конец каждой строки все входящие в нее цифры (с сохранением исходного порядка как среди цифр, так и среди остальных символов очереди). Пожалуйста, помогите с кодом или примерным алгоритмом последовательности действий, буду очень благодарная любой помощи!

Решение задачи: «Используя очередь переписать содержимое текстового файла»

textual
Листинг программы
#include <stdio.h>
#include <ctype.h>
#include <string.h>
 
typedef struct _deque {
    char*  buf;
    size_t left;
    size_t right;
    size_t cnt;
} deque_t;
 
void  deque_init(deque_t* deq, char* _pbuf);
int   deque_offset(deque_t* deq, const char* s, size_t size);
void  deque_add_front(deque_t* deq, char c);
void  deque_add_back(deque_t* deq, char c);
char* deque_c_str(deque_t* deq);
 
 
int part_pcopy(FILE* fin, FILE* fout){
    char    buf[512], dbuf[512], *s;
    size_t  len;
    deque_t deq;
 
    deque_init(&deq, dbuf);
 
    while(fgets(buf, sizeof(buf), fin)){
 
        len = strlen(buf);
        if((len > 0) && (buf[len - 1] == '\n'))
            buf[--len] = '\0';
 
        if(deque_offset(&deq, buf, len)){
 
            for(s = &buf[0]; *s; ++s){
                if(isdigit(*s))
                    deque_add_back(&deq, *s);
                else
                    deque_add_front(&deq, *s);
            }
 
            fputs(deque_c_str(&deq), fout);
        } else
            fputs(buf, fout);
        
        if(! feof(fin))
            fputc('\n', fout);
    }
    fflush(fout);
    return 1;
}
 
 
int main(void){
    FILE* fin  = fopen("input.txt",  "r");
    FILE* fout = fopen("output.txt", "w+");
    part_pcopy(fin, fout);
    fclose(fin);
    fclose(fout);
    return 0;
}
 
 
void deque_init(deque_t* deq, char* _pbuf){
    deq->buf   = _pbuf;
    deq->left  = 0;
    deq->right = 0;
    deq->cnt   = 0;
}
 
int deque_offset(deque_t* deq, const char* s, size_t size){
    deq->left  = 0;
    deq->right = size;
    deq->cnt   = size;
 
    while(*s){
        if(isdigit(*s++))
            --(deq->right);
    }
    return (deq->right != size);
}
 
void deque_add_front(deque_t* deq, char c){
    deq->buf[deq->left++] = c;
}
 
void deque_add_back(deque_t* deq, char c){
    deq->buf[deq->right++] = c;
}
 
char* deque_c_str(deque_t* deq){
    deq->buf[deq->cnt] = '\0';
    return deq->buf;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4.222 из 5
Похожие ответы