2013-10-27 3 views
0

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

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

Обратное любопытство было разумным, а не этим – P0W

+0

У вас есть векторный пункт деталя. Если вам нужны массивы вместо векторов, было бы разумно иметь массив itemDetails, а не текст столбца массива. –

ответ

0

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

#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 
Смежные вопросы