为什么第一行向右移动了一个空格?

时间:2016-11-29 01:14:39

标签: c++ file loops

好的,所以我和一些同事正在上课。我完全完成了它;但是,有一件事我和我的同事都无法解决。我在网上搜索了几个小时,但不能满足我的需要。

从文件中读取数据后打印的第一行始终向右移动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

单词和数字都应该用标签分隔。

图像显示了我总是给出的输出。 enter image description here

2 个答案:

答案 0 :(得分: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;

现在结果格式正确!

答案 1 :(得分:2)

这是一种幻觉。第一行正确间隔。您使用getline阅读的其他每个值都会包含\n字符,这是inputFile >> price停止的位置。

快速解决方法是在阅读price后要忽略行尾的所有字符(要求您加入<limits>):

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;
    }
}