Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将.txt中的数据输入结构数组 我的C++作业,我有一个.txt文档,里面包含了类似于:的建筑信息。_C++_Arrays_Struct - Fatal编程技术网

将.txt中的数据输入结构数组 我的C++作业,我有一个.txt文档,里面包含了类似于:的建筑信息。

将.txt中的数据输入结构数组 我的C++作业,我有一个.txt文档,里面包含了类似于:的建筑信息。,c++,arrays,struct,C++,Arrays,Struct,建筑物名称 建成年份 横向坐标 lon坐标 前 我必须将其读入我创建的结构的数组中: struct list { char name[50]; int yearBuilt; double latCoord; double lonCoord; } building; 现在,我已经创建了一个for循环,以便将数据读入我创建的类型列表数组: list buildingnumber[SIZE]; //array for buildings 但是,当我试图打印出“k”

建筑物名称 建成年份 横向坐标 lon坐标

我必须将其读入我创建的结构的数组中:

struct list 
{
    char name[50];
    int yearBuilt;
    double latCoord;
    double lonCoord;
} building;
现在,我已经创建了一个for循环,以便将数据读入我创建的类型列表数组:

list buildingnumber[SIZE]; //array for buildings
但是,当我试图打印出“k”最早建造的建筑物时,数组中没有显示任何数据

以下是我当前的代码:

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

using namespace std;
const int SIZE = 5000;

//struct for building type
struct list 
{
    char name[50];
    int yearBuilt;
    double latCoord;
    double lonCoord;
}building;

list buildingnumber[SIZE]; //array for buildings

void InsertionSort(list buildingnumber[], int buildingsloaded)
{
    int key = 0, i = 0;
    for(int j = 1; j < buildingsloaded; j++)
    {
        key=buildingnumber[j].yearBuilt;
        i=j-1;
        while(buildingnumber[i].yearBuilt > key && i >= 0)
        {
            buildingnumber[i+1] = buildingnumber[i];
            i--;
        }
        buildingnumber[i+1].yearBuilt = key;
    }
}

int main()
{
    char filePath[50];
    ifstream openFile;
    cout << "Enter the path of the building file: ";
    cin.getline(filePath, 50);
    openFile.open(filePath);

    //verify if file is opened + report buildings loaded
    int buildingsloaded = 0;
    if(!openFile.fail())
    {
        while(openFile >> building.name >> building.yearBuilt >> building.latCoord >> building.lonCoord)
        {
            buildingsloaded++;
        }
        cout << buildingsloaded << " buildings have been loaded." << endl;
    }

    // get how many buildings user wants
    int k = 0;
    cout << "How many buildings are you interested in?: ";
    cin >> k;

    //create array
    // loadKbuildings(building, buildingsloaded);
    for(int i = 0; i < k; i++)
    {
        openFile >> buildingnumber[i].name >> buildingnumber[i].yearBuilt >> buildingnumber[i].latCoord >> buildingnumber[i].lonCoord;  
    }

    // insertion sort
    InsertionSort(buildingnumber, buildingsloaded);

    // display earliest k buildings
    cout << "The " << k << " oldest buildings are: " << endl;
    int i = 0;
    while ( i < k )
    {
        cout << buildingnumber[i].name << endl;
        cout << "Year Built: " << buildingnumber[i].yearBuilt << endl;
        cout << "Coordinates: (" << buildingnumber[i].latCoord << "," << buildingnumber[i].lonCoord << ")" << endl;
        cout << endl;
        i++;
    }
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
常数int SIZE=5000;
//建筑类型结构
结构列表
{
字符名[50];
国际年建成;
双拉特库德;
双隆库德;
}建筑;
列表buildingnumber[大小]//建筑物阵列
void InsertionSort(列表buildingnumber[],int BuildingLoaded)
{
int键=0,i=0;
对于(int j=1;jkey&&i>=0)
{
建筑编号[i+1]=建筑编号[i];
我--;
}
buildingnumber[i+1]。YearBuild=key;
}
}
int main()
{
char文件路径[50];
ifstreamopenfile;
cout>building.name>>building.yearbuilded>>building.latCoord>>building.lonCoord)
{
buildingsload++;
}
cout buildingnumber[i]。名称>>buildingnumber[i]。年建>>buildingnumber[i]。latCoord>>buildingnumber[i]。lonCoord;
}
//插入排序
插入排序(buildingnumber,BuildingLoaded);
//显示最早的k建筑物
cout问题在于:

if(!openFile.fail())
{
    while(openFile >> building.name >> building.yearBuilt >> building.latCoord >> building.lonCoord)
    {
        buildingsloaded++;
    }
    cout << buildingsloaded << " buildings have been loaded." << endl;
}

您应该使用
std::string
std::vector
而不是C样式的数组。由于字符串是如何从输入文本流中读取的,您的名称读取将只提取多单词名称的第一部分。一旦发生这种情况,流的其余部分将被回避,以便将字段与流位置进行匹配。建议你设计一个
getline()
计划。它似乎工作得更好,因为我已经获得了建筑名称、lat和long坐标。但循环似乎并没有增加。如果我对5栋建筑感兴趣,它会显示同一栋建筑的5栋。很抱歉,在键入上一栋之前,我没有听到你的cin.getline()评论,我会尝试一下,然后返回you@kxf951即使没有更改getline,它应该仍然适用于以下测试用例:Parking/1993/34.2252/37.5563/Admin/1985/34.2356/37.5734/并键入2。或者可能是你的插入运动。试着把它拿出来?我想我的插入排序可能有问题。正如你可能猜到的,我试图报告“k”最早建造的建筑。你是对的,是我的插入排序导致相同的建筑重复出现。我试着看看我做错了什么
if(!openFile.fail())
{
    while(openFile >> building.name >> building.yearBuilt >> building.latCoord >> building.lonCoord)
    {
        buildingsloaded++;
    }
    cout << buildingsloaded << " buildings have been loaded." << endl;
}
int c = 0;
if(!openFile.fail())
{
    // *
    while(openFile >> buildingnumber[c].name >> buildingnumber[c].yearBuilt >> buildingnumber[c].latCoord >> buildingnumber[c].lonCoord)
    {
        buildingsloaded++;
        c++;
    }
    cout << buildingsloaded << " buildings have been loaded." << endl;
}
//create array
// loadKbuildings(building, buildingsloaded);
for(int i = 0; i < k; i++)
{
    openFile >> buildingnumber[i].name >> buildingnumber[i].yearBuilt >> buildingnumber[i].latCoord >> buildingnumber[i].lonCoord;  
}