Пример для ввода файла в члены структуры? - PullRequest
0 голосов
/ 24 апреля 2011

У меня следующая структура:

struct productInfo
{
    int item;
    string details;
    double cost;
};

У меня есть файл, в который будут введены 10 различных товаров, каждый из которых содержит товар, детали и стоимость.Я попытался ввести его с помощью inFile.getline, но он просто не работает.Может кто-нибудь дать мне пример, как это сделать?Я был бы признателен.

Редактировать Файл содержит 10 строк, которые выглядят следующим образом:

570314, SanDisk Sansa Clip 8 Гб MP3-плеер, черный, 55,99

Можете ли вы привести пример, пожалуйста.

Редактировать Извините, ребята, я новичок в C ++ и не очень понимаю предложения.Это то, что я пытался.

void readFile(ifstream & inFile, productInfo products[])
{
    inFile.ignore(LINE_LEN,'\n'); // The first line is not needed

    for (int index = 0; index < 10; index++)
    {
        inFile.getline(products[index].item,SIZE,DELIMETER);
        inFile.getline(products[index].details,SIZE,DELIMETER);
        inFile.getline(products[index].cost,SIZE,DELIMETER);
    }
}

Ответы [ 4 ]

1 голос
/ 24 апреля 2011

Это еще один подход, который использует fstream для чтения файла и getline() для чтения каждой строки в файле.Синтаксический анализ самой строки был специально пропущен , поскольку другие записи уже сделали это.

После того, как каждая строка прочитана и проанализирована в productInfo, приложение сохраняет ее в векторе,так что все продукты могут быть доступны в памяти.

#include <iostream>
#include <fstream>
#include <vector>
#include <iterator>
#include <string>

using namespace std; 

struct productInfo
{
    int item;
    string details;
    double cost;
};

int main()
{
    vector<productInfo> product_list;

    ifstream InFile("list.txt");
    if (!InFile) 
    {
        cerr << "Couldn´t open input file" << endl;
        return -1;
    }

    string line;
    while (getline(InFile, line)) 
    {   // from here on, check the post: How to parse complex string with C++ ?
        // /2071906/kak-razobrat-slozhnuy-stroku-s-c
        // to know how to break the string using comma ',' as a token

        cout << line << endl;

        // productInfo new_product;
        // new_product.item = 
        // new_product.details = 
        // new_product.cost = 
        // product_list.push_back(new_product);
    }    


    // Loop the list printing each item

    // for (int i = 0; i < product_list.size(); i++)
    //      cout << "Item #" << i << " number:" << product_list[i].item << 
    //                               " details:" << product_list[i].details <<
    //                               " cost:" << product_list[i].cost << endl;

}

EDIT : Я решил сделать попытку разбора строки и написал код ниже.Некоторым людям на С ++ может не понравиться метод обработки вещей strtok(), но он есть.

string line;
while (getline(InFile, line))
{
    if (line.empty())
        break;

    //cout << "***** Parsing: " << line << " *****" << endl;

    productInfo new_product;
    // My favorite parsing method: strtok()
    char *tmp = strtok(const_cast<char*>(line.c_str()), ",");
    stringstream ss_item(tmp);
    ss_item >> new_product.item;
    //cout << "item: " << tmp << endl;
    //cout << "item: " << new_product.item << endl;

    tmp = strtok(NULL, ",");
    new_product.details += tmp;
    //cout << "details: " << tmp << endl;
    //cout << "details: " << new_product.details << endl;

    tmp = strtok(NULL, " ");
    stringstream ss_cost(tmp);
    ss_cost >> new_product.cost;
    //cout << "cost: " << tmp << endl;
    //cout << "cost: " << new_product.cost << endl;

    product_list.push_back(new_product);
}
0 голосов
/ 24 апреля 2011

Вы должны 0) Создать новый экземпляр productInfo, pinfo;1) прочитать текст (используя getline) до первой запятой (','), преобразовать эту строку в int и поместить ее в pinfo.item.2) прочитать текст до следующей запятой и поместить его в pinfo.details;3) прочитать текст до конца строки, преобразовать строку в двойную и поместить ее в pinfo.cost.

Затем просто продолжайте делать это, пока не дойдете до конца файла.

0 голосов
/ 24 апреля 2011

Вот как бы я использовал getline. Обратите внимание, что я использую его один раз для чтения из входного файла, а затем снова, чтобы разделить эту строку на ",".

ostream& operator>>(istream& is, productInfo& pi)
{
  string line;
  getline(is, line);  // fetch one line of input

  stringstream sline(line);
  string item;

  getline(sline, item, ',');
  stringstream(item) >> pi.item;  // convert string to int

  getline(sline, item, ',');
  pi.details = item;              // string: no conversion necessary

  getline(sline, item);
  stringstream(item) >> pi.cost;  // convert string to double
  return is;
}

// usage:
// productInfo pi; ifstream inFile ("inputfile.txt"); inFile >> pi;

N.b .: Эта программа глючит, если ввод

99999,"The Best Knife, Ever!",16.95
0 голосов
/ 24 апреля 2011

Это зависит от того, что в файле?Если это текст, вы можете использовать оператор перенаправления в потоке ввода файла:

int i;infile >> i;

Если это двоичный файл, вы можете просто прочитать его в & your_struct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...