Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;容器拆分_C++_File_List_Vector_Containers - Fatal编程技术网

C++ C++;容器拆分

C++ C++;容器拆分,c++,file,list,vector,containers,C++,File,List,Vector,Containers,我在一个文本文件中有未知数量的int变量,我只知道变量的数量是6的倍数 我想将这些文件读入一个容器,并将它们拆分成更小的容器,每个容器取6个值 例如,如果文本文件中有30个变量,我需要5个容器,每个容器包含6个变量。它们需要按照文件中的顺序排列,即第一个容器包含前6个值 我已经把这些文件读入了一个列表,现在是矢量,我在想哪一个更合适。我已经读过关于split函数的内容,但是环顾四周之后,我没有能够成功地将它应用到其中一个尝试中,主要是因为我不知道我将需要多少更小的容器 这是我目前的代码: 矢量法

我在一个文本文件中有未知数量的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;istd::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;istd::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