前言
我现在学习文件的输入与输出,写下此篇博客充当学习笔记
问题回顾
英文电影中参演人员名单一般以某种方式进行排版显示。给定一个未排版的文件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<iomanip>//控制输出格式
#include<string>
using namespace std;
int main(){
int location;
cin >> location;//设置冒号固定的位置
ifstream infile("listin.txt");
ofstream outfile("listout.txt");
string str;
while (getline(infile,str))//读取文件中的一行,设置为按行读取
{
bool flag = true;//判断是在“:”前还是之后
string ocu, name;//分别表示职位和姓名
for (int i = 0; i < str.length();i++){
if(str[i]==':'){
flag = false;
continue;
}
if (flag == true){
if(str[i]!=' '&&str[i]!='\t'){//注意题目中有说制表符
ocu += str[i];
if(str[i+1]==' '||str[i+1]=='\t')
ocu += ' ';
}
}
else{
if(str[i]!=' '&&str[i]!='\t'){
name += str[i];
if(str[i+1]==' '||str[i+1]=='\t')
name += ' ';
}
}
}
outfile << setw(location - 1) << left << ocu << ':' << ' ' << name<<'\n';//输出到outfile文件中去,设置location-1个宽度,":"的位置自然就是location的位置了,"left"表示左对齐,头文件为iomanip
}
return 0;
}
可以一步步调试看看运行过程