【问题描述】
英文电影中参演人员名单一般以某种方式进行排版显示。给定一个未排版的文件listin.txt,该文件中每行参演人员名单由冒号“:”分隔成前后两部分,但格式杂乱无章,单词(由除空格和水平制表符之外的其它字符构成)之间可能有多个空格或水平制表符分隔。编写程序,要求将其按如下排版规则排版输出到另一个文件listout.txt中:
1.从标准输入读取一整数,作为排版后所有各行冒号“:”在一行中的固定位置;假设输入的整数肯定大于排版后所有各行冒号“:”前的字符个数,位置从1开始计数;
2.冒号“:”左边的单词串以行头为基准左对齐,左边的最后一个单词与冒号之间以空格填充;冒号“:”右边的单词串以冒号“:”为基准左对齐,最后一个单词后只有回车换行符,不再有其它字符;
3.冒号“:”左右两边的单词间都只有一个空格分隔,并且要求冒号两边至少各有一个空格。
假设输入文件中每行字符个数不超过100。
【输入形式】
待排版的参演人员名单从当前目录下的listin.txt文件中读入;表示冒号“:”位置的整数从标准输入读入。
【输出形式】
排版后的参演人员名单输出到当前目录下的listout.txt中。
【输入样例】
假设文件listin.txt内容为:
Digital Intermediate by : EFILM
Supervising Digital Colorist : STEVEN J. SCOTT
Second Colorist :ANDREW FRANCIS
Digital Intermediate Producer:LOAN PHAN
Digital Intermediate Editor: DEVON MILLER
表示冒号固定位置的整数为:
40
【输出样例】
文件listout.txt中的内容应为:
【样例说明】
输入的文件listin.txt中有五行参演人员名单,要求排版后冒号“:”位于第40个字符的位置,按照上述排版规则输出到文件listout.txt中
#include<stdio.h>
#include <string.h>
#include <stdlib.h>
int main()
{
void pr(char c[][100],int num,FILE *g,int x);
FILE *f,*g;
f=fopen("listin.txt","r");
g=fopen("listout.txt","w");
int i=1,num,x;
char c[100][100];
while (!feof(f))
{
fgets(c[i], 100, f);
i++;
}
scanf("%d",&num);//冒号位置
for(x=1;x<i;x++)
pr(c,num,g,x);//输出
fclose(f);
fclose(g);
return 0;
}
void pr(char c[][100],int num,FILE *g,int x)
{
int i=0,count=0,j,k=0;
while(c[x][k]==' '||c[x][k]=='\t')//去掉开始的空格和水平制表符
k++;
for( i=k;i<100;i++)
{
if(c[x][i]=='\0')
break;
if(c[x][i]==':')
{
for(j=count+1;j<num;j++)
fprintf(g," ");//补齐冒号之前的空格
fprintf(g,"%c",c[x][i]);
c[x][i]=' ';//将冒号位置重置为空格,执行下面去掉多余空格的语句后一定会保证冒号右边只输出一个空格
i--;
continue;
}
while((c[x][i]=='\t'||c[x][i]==' ')&&(c[x][i+1]=='\t'||c[x][i+1]==' '))//去掉两个单词之间多余空格和水平制表符
i++;
if(c[x][i]=='\t')
{
fprintf(g," ");
count++;
continue;
}
fprintf(g,"%c",c[x][i]);
count++;
}
}