【问题描述】
英文电影中参演人员名单一般以某种方式进行排版显示。给定一个未排版的文件listin.txt,该文件中每行参演人员名单由冒号ldquo:rdquo分隔成前后两部分,但格式杂乱无章,单词(由除空格和水平制表符之外的其它字符构成)之间可能有多个空格或水平制表符分隔。编写程序,要求将其按如下排版规则排版输出到另一个文件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<iostream>
#include<fstream>
#include<vector>
using namespace std;
#define infile "listin.txt"
#define outfile "listout.txt"
int main()
{
vector<string> str;
string Tstr;
ifstream fin;
fin.open(infile,ios::in);
if(fin.fail())
cout<<"file open fail!\n";
while(!fin.eof())
{
getline(fin,Tstr);
str.push_back(Tstr);
}
fin.close();
int x,flag=0,poi=0;
cin>>x;
int l=str.size();
string s(100,' ');
s[x-1]=':';
vector<string> ans(l,s);
for(int i=0;i<l;i++)
{
int str_l=str[i].size();
for(int j=0;j<str_l;j++)
{
if(str[i][j]==':')
{
poi=x+1;
flag=0;
}
else if(str[i][j]!=' '&&str[i][j]!='\t')
{
flag=1;
ans[i][poi++]=str[i][j];
}
else if(flag==1)
{
ans[i][poi++]=' ';
flag=0;
}
}
string::iterator it; //删除字符串尾部的空格
it=ans[i].begin();
if(*(it+poi-1)==' ')
poi-=1;
ans[i].erase(it+poi,it+100);
flag=0;
poi=0;
}
ofstream fout;
fout.open(outfile,ios::out);
for(int i=0;i<l;i++)
{
fout<<ans[i]<<'\n';
cout<<ans[i]<<'\n';
}
fout.close();
return 0;
}