#include #define STACK_INIT_SIZE 100
#define STACK_INCREMENT 10
typedef struct Stack
{
char *top;
char *base;
int stacksize;
}Stack, *pStack;
void init(pStack ps);
bool is_full(pStack ps);
bool is_empty(pStack ps);
void push(pStack ps, char ch);
bool pop(pStack ps);
void clear(pStack ps);
void traverse(pStack ps, FILE *fp);
void destroy(pStack ps);
void line_edit(FILE *fp);
int main()
{
FILE *fp = fopen("ed.txt","w");
if(!fp)
{
printf("创建文件失败!\n");
}
else
{
line_edit(fp);
fclose(fp);
}
return 0;
}
void init(pStack ps)
{
ps->base = (char *)malloc(sizeof(char) * STACK_INIT_SIZE);
if(!ps->base)
exit(-1);
ps->top = ps->base;
ps->stacksize = STACK_INIT_SIZE;
}
bool is_full(pStack ps)
{
if(ps->top - ps->base == ps->stacksize)
return true;
else
return false;
}
bool is_empty(pStack ps)
{
if(ps->top == ps->base)
return true;
else
return false;
}
void push(pStack ps, char ch)
{
if(is_full(ps))
{
ps->base = (char *)realloc(ps->base, sizeof(char) * (ps->stacksize + STACK_INCREMENT));
if(!ps->base)
exit(-1);
ps->top = ps->base + ps->stacksize;
ps->stacksize+=STACK_INCREMENT;
}
*(ps->top) = ch;
ps->top++;
}
bool pop(pStack ps)
{
if(is_empty(ps))
return false;
ps->top--;
return true;
}
void traverse(pStack ps, FILE *fp)
{
char * p = ps->base;
while(ps->top > p)
{
fputc(*p, fp);
p++;
}
}
void clear(pStack ps)
{
ps->top = ps->base;
}
void destroy(pStack ps)
{
free(ps->base);
ps->top = ps->base =NULL;
ps->stacksize = 0;
}
void line_edit(FILE *fp)
{
Stack s;
init(&s);
char ch;
printf("请输入一个文本文件,^Z结束输入:\n");
ch = getchar();
while(ch != EOF)
{
while(ch != EOF && ch != \n)
{
switch(ch)
{
case #:
if(!is_empty(&s))
pop(&s);
break;
case @:
clear(&s);
break;
default:
push(&s, ch);
}
ch = getchar();
}
traverse(&s, fp);
fputc(\n, fp);
clear(&s);
if(ch != EOF)
ch = getchar();
}
destroy(&s);
}