2017-07-07 120 views
0

我想讀一個文件,其中有AC米蘭球員的名字和他們的出生日期。我想在兩個對齊的列中顯示。我試圖使用setw()並離開,但結果不是我想要的。這是我用來讀取和打印的代碼:對齊列輸出C++

void read(char filename[]){ 
    fstream mio_file; 
    char c; 
    bool start_name = true; 
    bool start_date = true; 

    mio_file.open(filename, ios_base::in | ios_base::binary); 

    mio_file.read(&c, sizeof(char)); 
    while(!mio_file.eof()){ 

     if(c >= 'A' && c <= 'z' && start_name){ 
      cout << endl << "Name : "; 
      start_name = false; 
      start_date = true; 
     } 
     if(c >= '0' && c <= '9' && start_date){ 
      cout << setw(25) << left << "Date of birth : "; 
      start_date = false; 
      start_name = true; 
     } 

     cout << c; 
     mio_file.read(&c, sizeof(char)); 
    } 

    mio_file.close(); 
} 

這是輸出:

enter image description here

這是輸出,我想:

enter image description here

+0

setw(...)名稱 – Sopel

+0

@RickAstley:在此處使用正確。把這當作一個教訓,讓你做出清晰的表述! –

回答

3

你需要對列中的每一列使用std::setw。不只是設置一次。例如:

std::cout << std::left << std::setw(25) << "Column 1" << std::setw(25) << "Column 2" << std::endl; 

在您的特定情況下,你只需要它適用於名稱柱:在你的輸入數據,這些數據沒有提供

std::cout << std::left << std::setw(25) << "Name : "; 
+0

除了名字外,其他任何列都不需要。 –

+0

我試着在「Name:」字符串中添加setw +左邊的第一個字符串,但效果是右移球員姓名的效果。 – Chuck94

+0

@LightnessRacesinOrbit我站得更正。我試圖給出更一般的答案。我根據您的意見更新了答案。 – Ron

1

(NB我猜

你把setw放在錯誤的地方。

它在你要標題化的東西之前,而不是之後。 (這是因爲機械手需要開始以使其工作計數字符)。

因此,而不是(example):

cout << setw(25) << left << "Date of birth : "; 

試(example):

cout << endl << "Name : " << setw(25) << left; 

現在,流設置爲將下一個插入(即。cout << c)視爲柱狀,與寬度25左對齊。

Unfort不管怎樣,你一次只能讀取單個字符,所以你的IO操縱器永遠不會使用全名;只有個別人物。

所以你也得把你喂cout全字符串(example)之前做一些緩衝:

std::string token; 
mio_file.read(&c, sizeof(char)); 
while(!mio_file.eof()){ 

    if (c >= 'A' && c <= 'z' && start_name) { 
     cout << token; 
     cout << endl << "Name : " << setw(25) << left; 
     token = ""; 
     start_name = false; 
     start_date = true; 
    } 
    if (c >= '0' && c <= '9' && start_date) { 
     cout << token; 
     cout << "Date of birth : "; 
     token = ""; 
     start_date = false; 
     start_name = true; 
    } 

    token += c; 
    mio_file.read(&c, sizeof(char)); 
} 

// Final write 
cout << token; 

我敢肯定有實現這種循環的一種更好的方式,雖然。

+0

:「名稱:AxxxxxxxxxxxxxxxxxxxxbateDateofBirth:12/11/1986」x是空格 – Chuck94

+0

@ Chuck94:正確,讀取_full_答案。 –

+0

它只適用於字符串?如果我只想讀取一個字符,那麼沒有解決方案嗎? – Chuck94