2016-11-29 1 views
1

さて、私といくつかの同僚がクラスの課題に取り組んでいました。私はそれを私の最大限に完了しました。しかし、私も私の同僚の誰も修正できないことが1つあります。私は何時間もオンラインで検索しましたが、私が必要としていた答えはうまくいかなかったのです。最初の行が1桁右にシフトされているのはなぜですか?

ファイルからデータを読み込んだ後に最初に印刷される行は、常にスペースが1つ右に移動します。それが私の唯一の問題です。文字列はシフトされませんが、すべてです。空白、タブ、余分な記号がないかどうかを確認して、読んでいたファイルをすべて元に戻してみました。誰かが私のプログラムに間違っていることを指摘できれば、本当に感謝しています。前もって感謝します!

#include <iostream> 
#include <string> 
#include <fstream> 
#include <iomanip> 

using namespace std; 

int main() { 

ifstream inputFile; 

cout << "Please enter the file you would like to open: "; 
string filename; 
cin >> filename; 

inputFile.open(filename); 

if(inputFile.fail()) 
{ 
    cout << "Error: File failed to open or was not found..." << endl; 
} 
else 
{ 
    cout << "File opened" << endl; 

    string land; 
    double price, min, max, total, average, count; 

    count = 0; 
    min = 0; 
    max = 0; 
    total = 0; 

    while(inputFile.good()) 
    { 
     getline(inputFile, land, '\t'); 
     inputFile >> price; 

     cout << fixed << setprecision(2) << setw(40) << left << land << right << "$ " << price; 




     if(count == 0) 
     { 
      max = price; 
      min = price; 
     } 

     if(price > max) 
     { 
      max = price; 
     } 

     if(price < min) 
     { 
      min = price; 
     } 

     total += price; 


     count++; 
    } 

    inputFile.close(); 

    average = total/count; 

    cout << endl << endl; 
    cout << setw(43) << "Average Price =  $ " << average << endl; 
    cout << setw(43) << "Highest Price =  $ " << max << endl; 
    cout << setw(43) << " Lowest Price =  $ " << min << endl; 

} 



return 0; 
} 

私はそれがループであることには意味がありません、なぜ最初のものだけがシフトされていますか?

これは私が言葉や数字はすべてのタブで区切る必要があります

Landmark 1258 
Creekside 1840 
Parkside 1575 
Gallatyn Walk 1710 
Oak Mill 1185 
Cutler's Ridge 1495 
Prairie Creek Cottages 1987 
Waterview Mills 1505 
Canterbury Courts 1300 
Breckinridge Point 1205 
The Junction 1699 

を使用していたファイルにあったものです。

Imageは私がいつも与えていた出力を示しています。 enter image description here

+0

出力は、私のシステムにシフトしていないようです。 – Jarvis

+0

それは多分xcodeもの、端末でそれを試してみてください –

+0

なぜgetline(dlim = '\ t')? –

答えて

2

これは幻想です。最初の行は正しく配置されています。 getlineで読み取った値はすべて、\nという文字が含まれています。この文字は、inputFile >> priceのままです。

クイックフィックスは、(<limits>を含めるする必要があります)priceを読んだ後、行の終わりまでのすべての文字を無視することです:

getline(inputFile, land, '\t'); 
inputFile >> price; 
inputFile.ignore(numeric_limits<streamsize>::max(), '\n'); 
cout << setw(40) << left << land << right << "$ " << price << endl; 

より良いアプローチは、常に最初の場所でラインを読むことです。また、これは、より正確なループ条件で、あなたに取得する必要の練習は(このバージョンは<sstream>を使用しています):

string line; 
while(getline(inputFile, line)) 
{ 
    istringstream line_ss(line); 
    if(getline(line_ss, land, '\t') >> price) 
    { 
     cout << setw(40) << left << land << right << "$ " << price << endl; 
    } 
} 
+0

私は既に声明を使用することが許されています。悲しいことに、私はストリームや制限を使うことはできません。 –

+1

その場合、コードが壊れてしまいます。受け入れられた答えは、価格の後に改行以外の空白がないことを前提としています。あなたの行が先頭に空白を持つことが予想されない場合は、あなたのツールボックスにある['std :: ws'](http://en.cppreference.com/w/cpp/io/manip/ws)を使うことができます。あなたはIOマニピュレータを多用しています。数値制限は、デリミタまたはEOFまで_everything_を無視する正しい方法です。 'ignore(10000、 '\ n')'と同じように簡単に使うことができます。プログラムを受け入れると、非常に長い末尾の空白が壊れるバグがあります) – paddy

3

最初の行から変数 "land"は "Landmark"であり、他のすべての行は名前の前に\ nがあり、前の行から\ nCreekside " \などnParkside」 あなただけの文字列名から\ nを削除して、あなたのSTDの終わりにそれを追加することができ:: coutの:

while (inputFile.good()) 
    { 
     getline(inputFile, land, '\t'); 

     if (land[0] == '\n') 
     { 
      land.erase(0, 1); 
     } 


     inputFile >> price; 

     cout << fixed << setprecision(2) << setw(40) << left << land << right << "$ " << price << endl; 

今、結果が正しくフォーマットされました!

+0

Xcodeで入力したときに、すべてが制御不能になった。しかし、コードブロックでうまくいくようです。なぜそれがXcodeで動作しないのでしょうか? –

+0

私はコードブロックを使用して段階的に評価されるので、私はこのアプローチに進むと思います。手伝ってくれてどうもありがとう! –

関連する問題