содержимое текстового файла в массив

0

У меня есть текст file-> info.txt, который содержит следующие идентификаторы, игры, количество

info.txt

1,left4dead,50
2,warcraft3,60

Я знаю, как извлекать данные с помощью векторов с моими кодами, показанными ниже.

stock.h

#ifndef stock_stock_h
#define stock_stock_h
#include <iostream>

class  stock  {    
public: 
  stock() {
     columnOneText = " ";
     columnTwoText  = " ";
}

stock(std::string columnOneText,
      std::string columnTwoText
);

std::string getColumnOne();
std::string getColumnTwo();

void setItemId(std::string columnOneText);
void setItemDescription(std::string columnTwoText);

private:
  std::string columnOneText, columnTwoText;
};    
#endif 

main.cpp

#include "stock.h"
#include <iostream>
#include <string>
#include <fstream>
#include <sstream>
#include <vector>
using namespace std;
stock::stock(string columnOneText,
         string columnTwoText)
{
   setItemId(columnOneText);
   setItemDescription(columnTwoText);
};
 string stock::getColumnOne()    {
   return columnOneText; 
 }
string stock::getColumnTwo()  {
   return columnTwoText;
}
void stock::setItemId(string columnOneText)    {
  this->columnOneText = columnOneText;
}
void stock::setItemDescription(std::string columnTwoText) {
  this->columnTwoText = columnTwoText;
}

int main(){
  vector<stock> itemDetails;
  string line;
  string columnOneText;
  string columnTwoText;
  ifstream readFile("info.txt");

  while(getline(readFile,line))   {
     stringstream iss(line);
     getline(iss, columnOneText,',');
     getline(iss, columnTwoText, ',');

    //consturctor
    stock splitedColumns(columnOneText,
                         columnTwoText
                         );
    itemDetails.push_back(splitedColumns);
}
readFile.close();

cout << "this is column One in text file" << endl;
for (int i =0; i<itemDetails.size(); i++) {
    cout << itemDetails[i].getColumnOne()  << " " << endl;
}

cout << "this is column Two in text file" << endl;
for (int i =0; i<itemDetails.size(); i++) {
    cout << itemDetails[i].getColumnTwo()  << " " << endl;
}

}

то, что я действительно не знаю, - это как извлечь детали, используя массивы вместо использования векторов.

Я пробовал это, но он, похоже, не работает

  string line;
  string columnOneText;
  string columnTwoText;
  string columnOneTextArray[7];
  while(getline(readFile,line))   {
    stringstream iss(line);
    getline(iss, columnOneText,',');
    getline(iss, columnTwoText, ',');
    for(int i=0; i<8; i++) {
       columnOneTextArray[i] = columnOneText;
       cout << columnOneTextArray[i];
   }  
}

Вы, ребята, можете спросить, почему я хочу сделать это в массивах вместо использования вектора, мне просто интересно и как это можно сделать с помощью массивов.

  • 1
    Обратное любопытство было разумным, а не этот
  • 0
    У вас есть вектор itemDetails. Если вам нужны массивы вместо векторов, было бы разумно иметь массив itemDetails, а не столбец массива с одним текстом.
Теги:
csv
arrays
file-io
vector

1 ответ

0

Вы можете решить проблему проще, используя определения struct в дополнение к использованию векторов (ваше использование классов немного перегружено, IMHO):

#include <fstream>
#include <iostream>
#include <cstdlib>
#include <vector>
#include <sstream>

//this utilizes a more idiomatic naming convention as opposed to 'columnX'
typedef struct Stock {
    int id;
    std::string games;
    int amount;
} Stock;

//Syntactic sugar for easier output
std::ostream& operator << (std::ostream& in, const Stock& stock) {
    in << stock.id << " " << stock.games << " " << stock.amount;
    return in;
}

int main() {
    std::string filename = "info.txt";
    std::fstream ifile;
    std::vector <Stock> inventory;
    Stock stock_t;//a temporary Stock variable
    std::string temp;

    ifile.open(filename.c_str(), std::ios::in);

    if (!ifile.is_open()) {
        std::cerr << "There was a problem opening the input file: \"" << filename << "\"\n";
        exit(1);
    }

    while (ifile >> temp) {
        std::istringstream iss(temp);

        int column = 0;
            //break each constituent line by using the comment as a delimiter:
        while(std::getline(iss, temp, ',')) {

            if (column == 0) {
                stock_t.id = std::atoi(temp.c_str());
            }
            else if (column == 1) {
                stock_t.games = temp;   
            }
            else if (column == 2) {
                stock_t.amount = std::atoi(temp.c_str());
            }

            ++column;
        }
        inventory.push_back(stock_t);
    }

    for (int i = 0; i < inventory.size(); ++i) {
        std::cout << inventory[i] << "\n";
    }

    ifile.close();

    return 0;
}

Какие результаты:

1 left4dead 50
2 warcraft3 60

Ещё вопросы

Сообщество Overcoder
Наверх
Меню