我有以下结构:
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);
}
}
答案 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