这是一项任务,我陷入第一次信息阅读过程中。 我需要从文件" bank.txt"中读取信息。 文件的每一行都是这样的: 稻(中国),13,2016-8-3,5kg
我写了一个cpp进行测试:
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
struct Food
{
string name;
int quantity;
string expireDate;
string unit;
bool selected;
};
void all(Food item[]);
int main()
{
ifstream infile;
Food bank[100];
infile.open("bank.txt");
string text, temp[400];
string dummy;
int num;
stringstream linestream;
while(infile.good())
{
for(int i = 0; i < 100; i++)
{
for(int j = 0; j < 4; j++)
{
getline(infile, text, ',');
temp[4 * i + j] = text;
}
istringstream(temp[4 * i + 1]) >> num;
bank[i].name = temp[4 * i];
bank[i].quantity = num;
bank[i].expireDate = temp[4 * i + 2];
bank[i].unit = temp[4 * i + 3];
}
}
all(bank);
return 0;
}
void all(Food item[])
{
for(int i = 0; i < 100; i++)
cout << item[i].name << ".." << item[i].quantity << ".." << item[i].expireDate << ".." << item[i].unit << endl;
}
但是这会遇到一些问题,奇数行只显示名称。
如何修改我的代码以使其正常运行?
答案 0 :(得分:1)
使用','
作为getline
的分隔符会在流中留下换行符。
相反,首先阅读整行,然后使用从中构建的stringstream
来提取部分
(出于某种原因,你已经声明了一个似乎是这个的变量,但你永远不会使用它。)
string line;
if (getline(infile, line))
{
istringstream linestream(line);
for (int j=0;j<4;j++)
{
getline(linestream,text,',');
temp[4*i+j]=text;
}
//...
还有while (infile.good())
的问题,您不应该这样做 - 您可能需要重新构建代码。
在this question and answers中了解更多相关信息(关于eof
,但关于“好”和“坏”信息流的原则相同)。
答案 1 :(得分:0)
您还应该考虑新行
#include <iostream>
#include <fstream>
#include <string>
#include <sstream>
using namespace std;
struct Food
{
string name;
int quantity;
string expireDate;
string unit;
bool selected;
};
void all(Food item[], int count);
int main()
{
ifstream infile;
Food bank[100];
infile.open("bank.txt");
string text, temp[400];
string dummy;
int num;
stringstream linestream;
int i = 0;
while (i < 100)
{
getline(infile, text, ',');
if (!infile.good()) {
break;
}
temp[4 * i] = text;
for (int j = 1; j<3; j++)
{
getline(infile, text, ',');
temp[4 * i + j] = text;
}
getline(infile, text, '\n');
temp[4 * i + 3] = text;
istringstream(temp[4 * i + 1]) >> num;
bank[i].name = temp[4 * i];
bank[i].quantity = num;
bank[i].expireDate = temp[4 * i + 2];
bank[i].unit = temp[4 * i + 3];
i++;
}
all(bank, i);
return 0;
}
void all(Food item[], int count)
{
for (int i = 0; i<count; i++)
cout << item[i].name << ".." << item[i].quantity << ".." << item[i].expireDate << ".." << item[i].unit << endl;
}