在c++中读入值并存储在列表中
read in values and store in list in c++
我有一个文本文件,数据如下:
name
weight
groupcode
name
weight
groupcode
name
weight
groupcode
现在我想把所有人的数据写入一个输出文件,直到最大重量达到10000 kg。
目前我有这个:
void loadData(){
ifstream readFile( "inFile.txt" );
if( !readFile.is_open() )
{
cout << "Cannot open file" << endl;
}
else
{
cout << "Open file" << endl;
}
char row[30]; // max length of a value
while(readFile.getline (row, 50))
{
cout << row << endl;
// how can i store the data into a list and also calculating the total weight?
}
readFile.close();
}
我的工作与visual studio 2010专业!
因为我是c++初学者,所以可能有更好的方法!我愿意接受任何想法和建议
提前感谢!
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <limits>
struct entry
{
entry()
: weight()
{ }
std::string name;
int weight; // kg
std::string group_code;
};
// content of data.txt
// (without leading space)
//
// John
// 80
// Wrestler
//
// Joe
// 75
// Cowboy
int main()
{
std::ifstream stream("data.txt");
if (stream)
{
std::vector<entry> entries;
const int limit_total_weight = 10000; // kg
int total_weight = 0; // kg
entry current;
while (std::getline(stream, current.name) &&
stream >> current.weight &&
stream.ignore(std::numeric_limits<std::streamsize>::max(), 'n') && // skip the rest of the line containing the weight
std::getline(stream, current.group_code))
{
entries.push_back(current);
total_weight += current.weight;
if (total_weight > limit_total_weight)
{
break;
}
// ignore empty line
stream.ignore(std::numeric_limits<std::streamsize>::max(), 'n');
}
}
else
{
std::cerr << "could not open the file" << std::endl;
}
}
Edit:由于您想要将条目写入文件,因此只需将条目流式输出而不是将它们存储在vector中。当然你也可以重载操作符>>和<<
这里有个线索。您是否发现了代码与问题描述之间的不匹配?在问题描述中,数据以四行、名称、权重、组代码和空白行为组。但是在您的代码中,每次循环只读取一行,您应该每次循环读取四行。像这样的
char name[30];
char weight[30];
char groupcode[30];
char blank[30];
while (readFile.getline (name, 30) &&
readFile.getline (weight, 30) &&
readFile.getline (groupcode, 30) &&
readFile.getline (blank, 30))
{
// now do something with name, weight and groupcode
}
不是很完美,但希望能让你走上正确的道路。记住,代码的结构应该与问题描述的结构匹配。
有两个文件指针,尝试读取输入文件并继续写入o/p文件。同时有一个计数器,并不断增加重量。当重量>= 10k时,断开循环。到那时,您将需要o/p文件中的数据。
使用此链接查看I/O api列表:http://msdn.microsoft.com/en-us/library/aa364232 (v = VS.85) . aspx
如果您想自己努力构建一个可用的程序,请阅读本文。如果你更喜欢通过实例学习并学习c++输入/输出的强大示例,我绝对建议你仔细阅读Simon的代码。
重要的是:当你写"char row[30];"时,你创建了一个30个字符的行缓冲区。在下一行中,您应该更改readFile。getline(行,50)调用readFile。getline(行,30)。否则,它将尝试读入50个字符,如果某人的名字超过30个字符,则缓冲区以外的内存将被损坏。所以,这是一个禁忌。;)
如果你想学习c++,我强烈建议你使用I/O标准库,而不是rplug建议的微软专用库。使用ifstream和getline是正确的。如果你想学习纯c++, Simon关于将字符数组转换为std::string的评论是正确的。
无论如何,john给出了关于围绕问题描述构建程序的好建议。正如他所说,您将需要在循环的每次迭代中读取四行。当您读取权重行时,您将希望找到一种方法从中获得数值输出(如果您坚持使用字符数组,请尝试http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/,或者尝试http://www.cplusplus.com/reference/clibrary/cstdlib/atof/获取非整数)。然后你可以把它加到总重量中。每次迭代,根据需要将数据输出到一个文件,一旦您的权重total>= 10000,您就知道该跳出循环了。
然而,您可能根本不想在while条件中使用getline:因为每次循环迭代必须使用getline四次,因此如果这样做,您要么必须使用类似Simon代码的东西,要么将结果存储在四个单独的缓冲区中(否则,您将没有时间读取权值并在读入下一行之前打印出该行!)。
相反,您还可以将循环结构为while(total <= 10000)或类似的结构。在这种情况下,可以使用四组if(readFile)。Getline (row, 30))在循环内,您将能够读取重量并打印出每组之间的内容。循环将在总权重超过10000的迭代后自动结束…但是,如果您到达文件的末尾,您也应该跳出它,否则您将永远陷入循环中。: p祝你好运!
- CertGetCertificateChain 具有支持的内存存储和证书信任列表
- 在C++中存储要输入的标签列表
- 从文本文件读取,然后将项目存储到列表中
- 如何存储字符串列表
- 我应该如何在工厂类中存储弱指针列表?
- 在C++中存储和修改多个列表
- 将列表迭代器存储为成员
- 您将如何在 C++ 的专辑类中存储曲目列表?
- 存储将单个查询图像与多个图像的列表匹配的关键点索引
- C++ EnumWindows,将列表存储在字符串数组中
- C++ 存储来自 char* 函数的字符列表
- 如何制作一个结构程序,在其中可以存储无限量的数据,以便每次您想要时都可以将另一个产品添加到列表中?
- 删除存储为邻接列表的图表中的边缘
- 无法在C 中的双重链接列表中存储每个单词
- 存储数据列表并自动分配给结构的最佳方法是什么
- 实现双链接列表,其中数据存储在堆上
- 使用列表存储对象
- 将所有类实例的列表存储为类中的静态数组
- 将 rng 的列表存储在 std::array 中以进行多线程处理
- 将递增数量的列表子列表存储在vector中