C++ C++;容器拆分
我在一个文本文件中有未知数量的int变量,我只知道变量的数量是6的倍数 我想将这些文件读入一个容器,并将它们拆分成更小的容器,每个容器取6个值 例如,如果文本文件中有30个变量,我需要5个容器,每个容器包含6个变量。它们需要按照文件中的顺序排列,即第一个容器包含前6个值 我已经把这些文件读入了一个列表,现在是矢量,我在想哪一个更合适。我已经读过关于split函数的内容,但是环顾四周之后,我没有能够成功地将它应用到其中一个尝试中,主要是因为我不知道我将需要多少更小的容器 这是我目前的代码: 矢量法C++ C++;容器拆分,c++,file,list,vector,containers,C++,File,List,Vector,Containers,我在一个文本文件中有未知数量的int变量,我只知道变量的数量是6的倍数 我想将这些文件读入一个容器,并将它们拆分成更小的容器,每个容器取6个值 例如,如果文本文件中有30个变量,我需要5个容器,每个容器包含6个变量。它们需要按照文件中的顺序排列,即第一个容器包含前6个值 我已经把这些文件读入了一个列表,现在是矢量,我在想哪一个更合适。我已经读过关于split函数的内容,但是环顾四周之后,我没有能够成功地将它应用到其中一个尝试中,主要是因为我不知道我将需要多少更小的容器 这是我目前的代码: 矢量法
std::vector<int> Ticket;
std::ifstream fin (username + "Ticket.txt");
while (!fin.eof())
{
fin >> num;
Ticket.push_back(num);
}
fin.close();
Ticket.shrink_to_fit();
std::list<int> Ticket1;
std::ifstream fin (username + "Ticket.txt");
while (!fin.eof())
{
fin >> num;
Ticket1.push_back(num);
}
fin.close();
std::向量票据;
std::ifstream fin(用户名+“Ticket.txt”);
而(!fin.eof())
{
fin>>num;
票证。推回(num);
}
fin.close();
票证。收缩到适合();
列表方法
std::vector<int> Ticket;
std::ifstream fin (username + "Ticket.txt");
while (!fin.eof())
{
fin >> num;
Ticket.push_back(num);
}
fin.close();
Ticket.shrink_to_fit();
std::list<int> Ticket1;
std::ifstream fin (username + "Ticket.txt");
while (!fin.eof())
{
fin >> num;
Ticket1.push_back(num);
}
fin.close();
std::list Ticket1;
std::ifstream fin(用户名+“Ticket.txt”);
而(!fin.eof())
{
fin>>num;
Ticket1.推回(num);
}
fin.close();
或者,如果我能够以某种方式将文件中的6个值直接读取到较小的容器中,并一直这样做直到文件结束,因此跳过大容器,那将非常棒 我会使用C函数
Fscanf()
您可以使用一种格式,一次读取6个数字
fscanf(FILE,"%i %i %i %i %i %i",&var1,&var2,&var3,&var4,&var5,&var6)
然后,您只需要处理容器,在之前创建一个容器并直接读取它,或者通过处理值(如果它们是您所期望的) 我会使用C函数
Fscanf()
您可以使用一种格式,一次读取6个数字
fscanf(FILE,"%i %i %i %i %i %i",&var1,&var2,&var3,&var4,&var5,&var6)
然后,您只需要处理容器,在之前创建一个容器并直接读取它,或者通过处理值(如果它们是您所期望的) 您可以使用向量的向量
std::vector< std::vector<int> > Ticket;
std::vector<int> newVector;
std::ifstream fin (username + "Ticket.txt");
while ( fin >> num )
{
newVector.push_back( num );
// if the vector is full, then insert it and start afresh
if ( newVector.size() == 6 ) {
Ticket.push_back( newVector );
newVector.clear();
}
}
fin.close();
std::vectorTicket;
std::vector newVector;
std::ifstream fin(用户名+“Ticket.txt”);
而(fin>>num)
{
newVector.push_back(num);
//如果向量已满,则插入它并重新开始
如果(newVector.size()==6){
票。推回(newVector);
newVector.clear();
}
}
fin.close();
最后,票证向量应包含所有要求的向量
要将每个向量打印到控制台,请使用两个嵌套循环:
for ( int i = 0; i < Ticket.size(); i++ ) { // outer vector
for ( int j = 0; j < Ticket[i].size(); j++ ) { // inner vectors
std::cout << Ticket[i][j] << " ";
}
std::cout << "\n";
}
for(inti=0;i std::cout您可以使用向量的向量
std::vector< std::vector<int> > Ticket;
std::vector<int> newVector;
std::ifstream fin (username + "Ticket.txt");
while ( fin >> num )
{
newVector.push_back( num );
// if the vector is full, then insert it and start afresh
if ( newVector.size() == 6 ) {
Ticket.push_back( newVector );
newVector.clear();
}
}
fin.close();
std::vectorTicket;
std::vector newVector;
std::ifstream fin(用户名+“Ticket.txt”);
而(fin>>num)
{
newVector.push_back(num);
//如果向量已满,则插入它并重新开始
如果(newVector.size()==6){
票。推回(newVector);
newVector.clear();
}
}
fin.close();
最后,票证向量应包含所有要求的向量
要将每个向量打印到控制台,请使用两个嵌套循环:
for ( int i = 0; i < Ticket.size(); i++ ) { // outer vector
for ( int j = 0; j < Ticket[i].size(); j++ ) { // inner vectors
std::cout << Ticket[i][j] << " ";
}
std::cout << "\n";
}
for(inti=0;i std::cout如果您创建了一个临时累加器,那么您的最终目的地是:
vector<int> temp ;
vector<vector<int>> package ;
当您在软件包上推回时,它会复制一份,这就是为什么您可以在之后清除temp
。如果您创建一个临时累加器,您的最终目的地是:
vector<int> temp ;
vector<vector<int>> package ;
当您在包上推回时,它会复制一份,这就是为什么您可以在之后清除temp
。您需要容器中的值像在c数组中一样连续,还是需要使用std::v的reserve成员函数对内存分配进行更多控制如果不是,那么考虑DEGO或列表过矢量。
<>你也可以使用固定大小的数组,如果你有一个C++ 11编译器支持它。
例如,您可以设置这样的容器来设置数组列表
std::list<std::array<int, 6>> containersOfSix;
std::列出六个集装箱;
另一方面,如果希望容器的两个部分都是动态的,则可以使用其中一个插入器函数。
考虑通读这些材料,并玩弄其中的一些选项。这可能会导致您搜索与这些相关的其他线程,这将帮助您找到更具体的示例。您需要容器中的值像在c数组中一样连续,还是需要能够有更多的控制在使用STD::向量的储备成员函数的内存分配中,如果不是,那么考虑DEGO或列表过向量。
<>你也可以使用固定大小的数组,如果你有一个C++ 11编译器支持它。
例如,您可以设置这样的容器来设置数组列表
std::list<std::array<int, 6>> containersOfSix;
std::列出六个集装箱;
另一方面,如果希望容器的两个部分都是动态的,则可以使用其中一个插入器函数。
考虑通读这些材料,并玩弄其中的一些选项。这可能会导致您搜索与这些相关的其他线程,这将帮助您找到更具体的示例。这两种方法都是无效的。您不能使用eof()
。这永远都不正确。你的实际数据结构是什么?这6个整数是指不同的东西,还是指同一事物中的6个?还有@KerrekSB所说的-正确的阅读方法是while(fin>>num)
,而不使用eof()
。好的,谢谢关于eof()的提示,和@SebastianRedl。它是6个随机数字,范围为1-66。两种方法都是br