消息关闭
    暂无新消息!
文件0.txt存储:
F01		风扇	海尔	100		100
F02 风扇 海尔 200 100
F03 风扇 海尔 300 100
B02 冰箱 海尔 999 50
B02 冰箱 海尔 2000 50
B03 冰箱 海尔 3000 50
T02 电视 海尔 1000 150
T02 电视 海尔 2000 150
T03 电视 海尔 3000 150
K01 空调 海尔 2000 100
K02 空调 海尔 3000 100
K03 空调 海尔 4000 100


使用ifstream如何读取到下面的结构体里?
struct Goods {
string m_strType; // 类型
string m_strName; // 名称
string m_strBrand; // 品牌
int m_nPrice; // 价格
int m_nCount; // 数目
}


最后我使用一个循环,每次读出一行,push_back到我的容器中。

请问如何读取呢?

4个回答

︿ 2
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

struct Goods {
string m_strType; // 类型
string m_strName; // 名称
string m_strBrand; // 品牌
int m_nPrice; // 价格
int m_nCount; // 数目
};


#define MAX_BUF_SIZE (1024)
void ReadMyFile(const char* file_path, std::vector<Goods>& v)
{
if (NULL == file_path)
{
printf("file path is null\n");
return;
}

char buffer[MAX_BUF_SIZE] = {0};
ifstream in(file_path);

if (!in.is_open())
{
printf("Error open file\n");
return;
}

char type[MAX_BUF_SIZE] = {0};
char name[MAX_BUF_SIZE] = {0};
char brand[MAX_BUF_SIZE] = {0};
int price = 0;
int count = 0;
while (!in.eof())
{
in.getline(buffer, MAX_BUF_SIZE - 1);
sscanf(buffer, "%s%*[ \t]%s%*[ \t]%s%*[ \t]%d%*[ \t]%d", type, name, brand, &price, &count);
Goods goods = {type, name, brand, price, count};
v.push_back(goods);
}
}


int main()
{
std::vector<Goods> v;
ReadMyFile("test.txt", v);
for (auto it = v.begin(); it != v.end(); ++it)
{
printf("%s\t%s\t%s\t%d\t%d\n", it->m_strType.c_str(), it->m_strName.c_str(), it->m_strBrand.c_str(), it->m_nPrice, it->m_nCount);
}
return 0;
}
︿ 2

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

using namespace std;

struct Goods {
string m_strType; // 类型
string m_strName; // 名称
string m_strBrand; // 品牌
int m_nPrice; // 价格
int m_nCount; // 数目
void Init()
{
m_strType = m_strName = m_strBrand = string();
m_nPrice = m_nCount = 0;
}
friend istream& operator>> (istream& is, Goods& g);
friend ostream& operator<< (ostream& os, const Goods& g);
};

istream& operator>> (istream& is, Goods& g)
{
is >> g.m_strType >> g.m_strName >> g.m_strBrand >> g.m_nPrice >> g.m_nCount;
return is;
}

ostream& operator<< (ostream& os, const Goods& g)
{
const char c = ',';
os << g.m_strType << c
   << g.m_strName << c
   << g.m_strBrand << c
   << g.m_nPrice << c
   << g.m_nCount;
return os;
}

int main(int argc, char* argv[])
{
if(argc >= 2)
{
ifstream file;
file.open(argv[1]);
if(file.good())
{
vector<Goods> cont;
string line;
istringstream is;
Goods g;
while(getline(file,line))
{
is.clear();
is.str(line);
g.Init();
is >> g;
cont.push_back(g);
}
//for(auto& e : cont) //c++11
for(vector<Goods>::const_iterator it = cont.begin(); it != cont.end(); it++)
{
cout << *it << endl;
}
}
}
return 0;
}

程序使用、结果:
︿ 0
m_pListGoods = new list<Goods*>();
// 读文件
ifstream ifs;
ifs.open("product.txt", ios_base::in);

string strType;
string strName;
string strBrand;
int dPrice;
int nCount;
while (ifs >> strType >> strName >> strBrand >> dPrice >> nCount)
{
m_pListGoods->push_back(new Goods(strType, strName, strBrand, dPrice, nCount));
}
ifs.close();

while (ifs >> strType >> strName >> strBrand >> dPrice >> nCount)这句判定,在句子不合法,比如价格不是数字时,while循环就结束了。但不明白为什么结束?什么时候结束?