C++ 将数据推送到循环中的向量时出现问题

C++ 将数据推送到循环中的向量时出现问题,c++,arrays,file,C++,Arrays,File,这是我的txt文件,其中第一行是数据集的数量。第2行(size1变量)等于第3行(A1数组)中的元素数,第4行(size2变量)等于第5行(A2数组)中的元素数。我的readFile函数必须覆盖上面列出的变量和数组,而不覆盖数据集变量 MycountElementsInArray函数用于计算数组A1中数组A2中出现的位数。我的程序适用于一个数据集(txt中的5行),但当涉及到例如3个数据集(13行)时,我的readFile函数在将结果推回到向量命名计数时停止。我的问题是为什么它不正确以及如何替换

这是我的
txt
文件,其中第一行是
数据集的数量。第2行(size1变量)等于第3行(A1数组)中的元素数,第4行(size2变量)等于第5行(A2数组)中的元素数。我的readFile函数必须覆盖上面列出的变量和数组,而不覆盖
数据集
变量

My
countElementsInArray
函数用于计算数组
A1
中数组
A2
中出现的位数。我的程序适用于一个数据集(txt中的5行),但当涉及到例如3个数据集(13行)时,我的readFile函数在将结果推回到向量命名计数时停止。我的问题是为什么它不正确以及如何替换它

txt:

intmain(){
int数据集=0,size1=0,size2=0;
std::fstream文件;
openFile(文件);
int*A1=新的int[size1];
int*A2=新的int[size2];
readFile(文件、数据集、大小1、大小2、A1、A2);
}
void readFile(std::fstream&file、int&dataset、int&size1、int&size2、int*&A1、int*&A2){
病媒计数;
文件>>数据集;
对于(大小i=0;i<数据集;i++){
文件>>大小1;
对于(尺寸j=0;j>A1[j];
文件>>大小2;
对于(大小j=0;j>A2[j];
对于(大小j=0;j一个突出的问题是

int *A1 = new int[size1];
int *A2 = new int[size2]; 
由于
size1
size2
等于
0
,实际上您有一个大小为
0
的固定数组,它不能保存任何值,因此

文件>>A1[j];

还有这个

文件>>A2[j];

都是

size1
size
更改为
10
只是为了测试它,会得到一个结果

样本:

当前面的代码隐藏了一个丑陋的崩溃:

我想从这里你可以纠正你程序的其余部分

替换

for (size_t j = 0; j < size2; j++) {
     std::cout << counts[j] << " ";
}
(大小j=0;j{
std::cout@anastaciu我稍微修改了代码,现在我可以在调试器中看到程序正在将计数传递给向量计数,但我仍然无法显示它

void fread(std::fstream &file, std::vector<int> &A1, std::vector<int> &A2) {

    std::vector<int> counts;
    int dataSets, size1, size2, x, y;
    file >> dataSets;
    for (size_t i = 0; i < dataSets; i++) {
        file >> size1;

        for (size_t j = 0; j < size1; j++) {
            file >> x;
            A1.push_back(x);
        }

        file >> size2;

        for (size_t j = 0; j < size2; j++) {
            file >> y;
            A2.push_back(y);
        }

        for (size_t j = 0; j < size2; j++) {
            int searchValue = A2[j];
            counts.push_back(fcount(A1, size1, searchValue));
        }

        int numberOfDataSet = i + 1;
        std::cout << "Dataset" << numberOfDataSet << ":" << std::endl;
        for(auto& k : counts)
            std::cout << k;
        std::cout << std::endl;
    }
}
void fread(std::fstream&file,std::vector&A1,std::vector&A2){
病媒计数;
int数据集,大小1,大小2,x,y;
文件>>数据集;
对于(大小i=0;i<数据集;i++){
文件>>大小1;
对于(尺寸j=0;j>x;
A1.推回(x);
}
文件>>大小2;
对于(大小j=0;j>y;
A2.推回(y);
}
对于(大小j=0;jstd::cout帮助您解决问题会更容易。@anastaciu man这是用最简单的方式描述的。这意味着代码可以复制到编译器中,并且可以按照您的描述重现问题,创建一个重现问题的代码示例可能不容易,我发现通过这样做,您可以在相当多的时间内跟踪问题我是你自己。删除
countElementsInArray
函数没有任何帮助,你否认自己。“代码越多,人们发现你的问题的可能性就越小。”这很奇怪,因为我现在理解我的错误,但我的IDE显示了相同的结果,尽管如此,我给size1和Size2分配了10。在你的IDE中发生了什么,不是吗这里是错误?结果是错误的吗?我调试了它,一切都很顺利,但当vector试图推回时,它不会发生。在线编译器做得好是正常的吗?像这样打印向量,它仍然是未定义的行为,因为您访问的向量超出了边界,为了避免这种情况,最好对每个循环使用一个,我将它添加到好的,谢谢你,但你能解释一下,在我的例子中,当我打印向量时,向量超出了范围是什么意思吗?我没有打印任何超出向量大小的东西。
for (size_t j = 0; j < size2; j++) {
     std::cout << counts[j] << " ";
}
for(auto& i : counts)
   std::cout << i;
void fread(std::fstream &file, std::vector<int> &A1, std::vector<int> &A2) {

    std::vector<int> counts;
    int dataSets, size1, size2, x, y;
    file >> dataSets;
    for (size_t i = 0; i < dataSets; i++) {
        file >> size1;

        for (size_t j = 0; j < size1; j++) {
            file >> x;
            A1.push_back(x);
        }

        file >> size2;

        for (size_t j = 0; j < size2; j++) {
            file >> y;
            A2.push_back(y);
        }

        for (size_t j = 0; j < size2; j++) {
            int searchValue = A2[j];
            counts.push_back(fcount(A1, size1, searchValue));
        }

        int numberOfDataSet = i + 1;
        std::cout << "Dataset" << numberOfDataSet << ":" << std::endl;
        for(auto& k : counts)
            std::cout << k;
        std::cout << std::endl;
    }
}