C++ 从已从C+;中的文件加载的数组中获取输出+;

C++ 从已从C+;中的文件加载的数组中获取输出+;,c++,arrays,loops,C++,Arrays,Loops,我试图在将文件加载到数组中后将其内容打印出来。我正在打印第一个条目,但其余的都输出为0。我觉得我需要把另一个循环放在某个地方,但我不确定它在哪里最有效 这是我的密码: #include <iostream> #include <fstream> #include <cstdlib> #include <string> using namespace std; struct plane //strcutre of plane data to us

我试图在将文件加载到数组中后将其内容打印出来。我正在打印第一个条目,但其余的都输出为0。我觉得我需要把另一个循环放在某个地方,但我不确定它在哪里最有效

这是我的密码:

#include <iostream>
#include <fstream>
#include <cstdlib>
#include <string>

using namespace std;

struct plane //strcutre of plane data to use
{
   string name;
    string direction;
    int id;
    int coordX;
    int coordY;
    int height;
    int speed;

};

void populate (plane planeArray[], int n )
{
    string name, direction;
    int id, coordX, coordY, height, speed, i, c;
    ifstream infile;                              //declare input file stream
    infile.open("plane_data.txt");                //opens file
    if (!infile)
    {
        cout << "File cannot be reached";          //checks for invalid file path
    }

    for ( int i = 0; i < 4; i++ )
    {
        getline(infile, planeArray[i].name);
        infile >> planeArray[i].id;
        infile >> planeArray[i].coordX;
        infile >> planeArray[i].coordY;
        infile >> planeArray[i].height;
        infile >> planeArray[i].speed;
        getline(infile, planeArray[i].direction);
    }

    infile.close();

}

void text_display( plane planeArray[5])
{
    for ( int i = 0; i < 4; i++ )
    {
        cout << planeArray[i].name << endl;
        cout << planeArray[i].direction << endl;;
        cout << planeArray[i].id << endl;;
        cout << planeArray[i].coordX << endl;;
        cout << planeArray[i].coordY << endl;;
        cout << planeArray[i].height << endl;;
        cout << planeArray[i].speed << endl;;
        cout << endl;
    }
}


int main()
{
    const int N = 5;
    plane planeArray[N] = {};

    populate( planeArray, N );
    text_display( planeArray);
}
这是我运行代码时得到的输出:

Airbus A380

123456
123
300
25000
400

north

0
0
0
0
0



0
0
0
0
0



0
0
0
0
0


Process returned 0 (0x0)   execution time : 0.090 s
Press any key to continue.
非常感谢您的帮助!(另外,如果你能告诉我如何清除打印数据中的第一个和最后一个条目的空白行,那将是一个很好的奖励。)


干杯

空中客车的x坐标中有一个空格。这边

infile >> planeArray[i].coordX;
infile >> planeArray[i].coordY;
从同一行读取两次(123 300) 因此,您与正在读取的文件的结构不同步

您有两个选择:

  • 确保语法正确(只需删除空格并继续)
  • 添加额外的检查以确保您读取名称或数字

文件中的块之间有一条空行,您可以忽略它

读取第一个块并移动到第二个块后,文件位置仍在空行的前面。第二个数据块的读取与实际数据相差一行

这意味着您正在将一个空行读取到
planeArray[1]。name
,然后尝试从该行
Boeing-747
读取到
planeArray[1]。id
将失败,因为格式与
int
不匹配。此时,流进入错误状态,此后不再读取任何内容

这可以通过向循环末尾的伪字符串添加额外的
getline
来解决


您的文件还缺少除第一个块以外的所有块的第二个坐标,这将导致类似的问题。

在每次循环迭代之间,您应该检查流是否处于错误状态;我犯了愚蠢的错误。我已经修正了,并添加了任何丢失的数据,但我仍然得到相同的输出。同样的白色行之间的后续项目:要么添加一个额外的“GETLION”或删除它们从您的TrimFieli已经删除了空白行,输出仍然是出于某种原因。在您的程序中,你读1个名字,5个数字,1个名字。在文本文件中,您只有4个连续的数字。只需将你的文本文件与你试图快速修复的文本相一致,我就删除了每一部分数据之间的空行,但是我仍然得到相同的输出。对于虚拟行,它是否只是对数组的另一个添加,以及对数据块之间的空行的一个getline?@MichaelDelahorne为我的答案添加了另一个问题。对于虚拟变量,我的意思是类似于
strings;getline(填充,s)。然后,
s
是虚拟的,因为您实际上不需要它的值。
infile >> planeArray[i].coordX;
infile >> planeArray[i].coordY;