C ++. Итерирование ввода файла в массив типа класса

следующий текст читает текст из файла списка поставщиков.

vendor.h

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

using namespace std;

class Vendor
{

public:
//data types
int VendorID;

string VendorName;
string VendorCity;
string VendorState;

int VendorZip;

//constructors
Vendor(int ID, string Name, string City, string State, int Zip){ VendorID = ID, VendorName = Name, VendorCity = City, VendorState = State, VendorZip = Zip;}
Vendor(){};

//desturcutor
~Vendor();

void SetID(int ID);
void SetName(string name);
void SetCity(string city);
void SetState(string state);
void SetZip(int zip);

};

#include "Vendor.h"
void main ()
{

Vendor VenList[150];

ifstream GetText;

GetText.open("VendorListFile.txt");if (!GetText.is_open())
{

cout << "File could not be opened" << endl;

exit(EXIT_FAILURE);

}while (GetText.good())
{

cout << element << " ";
GetText >> element;

}

}

очевидно, что код может читать текст, но сейчас я собираюсь перебрать каждый элемент и передать их конструктору для класса vendor, чтобы встроить элементы в вендоры, которые будут храниться в массиве. Я думал сделать это с помощью цикла while, подобного следующему.

int counter = 150;
while (counter > 0)
{

Vendor (name = [counter + 1], state = [counter + 2] ... );
counter -= 5;

}

Следующий вопрос будет предполагать, что это конструкция, как мне найти этих поставщиков в памяти, чтобы проиндексировать или переместить их, и как заставить программу читать элементы 1 на 1, разбивая пробелы между элементами. Цикл while — это псевдокод, поэтому я сделал несколько синтаксических ошибок

-1

Решение

Давайте рассмотрим следующее VendorListFile.txt:

1 Intel Chicago IL 12345
2 Dell Seattle WA 23456
3 HP Paris FR 34567

Обратите внимание, что с учетом текущей реализации (например, массива вендоров фиксированного размера) этот файл не должен превышать 150 строк, иначе ваша программа будет аварийно завершать работу при ее анализе.

Затем вы можете использовать следующий откорректированный код, чтобы проанализировать его, сохранить поставщиков как объекты в массиве VenList и перебирать этот массив для вашего удобства:

// Vendor.h
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

class Vendor
{

public:
//data types
int VendorID;

string VendorName;
string VendorCity;
string VendorState;

int VendorZip;

//constructors
Vendor(int ID, string Name, string City, string State, int Zip){ VendorID = ID, VendorName = Name, VendorCity = City, VendorState = State, VendorZip = Zip;}
Vendor(){};

//desturcutor
~Vendor();

void SetID(int ID);
void SetName(string name);
void SetCity(string city);
void SetState(string state);
void SetZip(int zip);

};

::std::istream & operator >> (::std::istream & stream, Vendor & vendor);
::std::ostream & operator << (::std::ostream & stream, const Vendor & vendor);

// Vendor.cpp
Vendor::~Vendor() {}

::std::istream & operator >> (::std::istream & stream, Vendor & vendor) {
stream >> vendor.VendorID;
stream >> vendor.VendorName;
stream >> vendor.VendorCity;
stream >> vendor.VendorState;
stream >> vendor.VendorZip;
return stream;
}

::std::ostream & operator << (::std::ostream & stream, const Vendor & vendor) {
stream << "ID: " << vendor.VendorID << ::std::endl;
stream << "Name: " << vendor.VendorName << ::std::endl;
stream << "City: " << vendor.VendorCity << ::std::endl;
stream << "State: " << vendor.VendorState << ::std::endl;
stream << "ZIP: " << vendor.VendorZip << ::std::endl;
return stream;
}

// main.cpp
int main ()
{

Vendor VenList[150];

ifstream GetText;

GetText.open("VendorListFile.txt");if (!GetText.is_open())
{

cout << "File could not be opened" << endl;

exit(EXIT_FAILURE);

}

// Store the vendors as objects in the VenList array
int nVendors = 0;
GetText >> VenList[nVendors];

while (GetText.good())
{

cout << VenList[nVendors];
++nVendors;
GetText >> VenList[nVendors];

}

// Iterate the vendor objects from the VenList array
for (int i = 0; i < nVendors; ++i) {
cout << VenList[i];
}

return EXIT_SUCCESS;
}

Я для простоты объединил все в один файл, не стесняйтесь организовать код в 3 файла / добавьте необходимые #includeс, если хотите.

Обратите внимание, что нам на самом деле не нужно использовать специализированный конструктор, поскольку 150 объектов вендоров уже были созданы с использованием конструктора по умолчанию, когда мы создавали массив VenList. Поэтому вместо этого мы изменяем эти объекты при чтении файла, используя наш перегруженный оператор >>.

Код компилируется и отлично работает с GCC 4.8.2 в Gentoo Linux. Выполнение этого дает следующий вывод:

ID: 1
Name: Intel
City: Chicago
State: IL
ZIP: 12345
ID: 2
Name: Dell
City: Seattle
State: WA
ZIP: 23456
ID: 3
Name: HP
City: Paris
State: FR
ZIP: 34567
ID: 1
Name: Intel
City: Chicago
State: IL
ZIP: 12345
ID: 2
Name: Dell
City: Seattle
State: WA
ZIP: 23456
ID: 3
Name: HP
City: Paris
State: FR
ZIP: 34567

В этом примере поставщики печатаются дважды: один раз из исходного цикла анализа и другой раз при переборе массива VenList.

Ключи здесь являются функциями:

  • :: станд :: IStream & оператор >> (:: std :: istream & ручей, продавец &
    поставщик)
  • :: станд :: ostream & оператор << (:: станд :: ostream & поток, постоянный
    продавец & поставщик)

Если вы измените структуру класса / файла вендора, вам необходимо соответствующим образом настроить эти функции.

Надеюсь, что это поможет.

1

Другие решения


По вопросам рекламы [email protected]