文件输入到结构成员的示例?

时间:2011-04-24 00:39:53

标签: c++ file-io input structure

我有以下结构:

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

我有一个文件可以输入10个不同的产品,每个产品都包含一个项目,详细信息和成本。我试图使用inFile.getline输入它,但它只是不起作用。谁能给我一个如何做到这一点的例子?我很感激。

修改 该文件包含10行,如下所示:

570314,SanDisk Sansa Clip 8 GB 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 个答案:

答案 0 :(得分:1)

这是另一种使用fstream读取文件并getline()读取文件中每一行的方法。该行本身的解析是故意遗漏since other posts已经做到了。

在读取每行并将其解析为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++ ?
        // https://stackoverflow.com/questions/2073054/how-to-parse-complex-string-with-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;

}

编辑:我决定尝试解析该行并编写下面的代码。一些C ++人可能不喜欢处理事物的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);
}

答案 1 :(得分:0)

这取决于文件中的内容?如果是文本,则可以在文件输入流上使用重定向运算符:

int i; infile&gt;&gt; I;

如果是二进制文件,您只需将其读入&amp; your_struct。

即可

答案 2 :(得分:0)

你必须这样做 0)创建productInfo的新实例,pinfo; 1)将文本(使用getline)读取到第一个逗号(','),将此字符串转换为int,并将其放入pinfo.item。 2)将文本读到下一个逗号并将其放入pinfo.details; 3)将文本读取到结束行,将字符串转换为double,并将其放入pinfo.cost。

然后继续这样做直到你到达文件的末尾。

答案 3 :(得分:0)

以下是我如何使用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