檔案排版(文字檔案讀寫)

南懿燁曦發表於2020-12-27

前言

本人正在學習檔案的輸入與輸出,寫下此篇部落格充當學習筆記

問題回顧

英文電影中參演人員名單一般以某種方式進行排版顯示。給定一個未排版的檔案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;
}

可以一步步除錯看看執行過程