C++ C++;:无法读取大型txt文件

C++ C++;:无法读取大型txt文件,c++,input,vector,mergesort,C++,Input,Vector,Mergesort,您的程序导致堆栈溢出您的问题在于合并功能: 超过局部变量c long c[30]; 也许还有更多的问题,这是我第一次注意到的 编辑 试试这个:找出不同之处 #include <map> #include <vector> #include <fstream> #include <iostream> #include <time.h> using namespace std; void merge(vector<long>

您的程序导致堆栈溢出

您的问题在于合并功能:

超过局部变量c

long c[30];

也许还有更多的问题,这是我第一次注意到的

编辑 试试这个:找出不同之处

#include <map>
#include <vector>
#include <fstream> 
#include <iostream> 
#include <time.h>
using namespace std;

void merge(vector<long> &,long ,long , long );


void divide(vector<long> &arr,long min, long max){
    long mid;

    if(min<max){
        mid=(min+max)/2;
        if(min != mid) divide(arr,min,mid);
        if(max != mid+1) divide(arr,mid+1,max);
        merge(arr,min,mid,max);
    }
    return;

}

void merge(vector<long> &arr,long min, long mid,long max){
    long i,j,k;
    map<long,long> c; //uses map because the vector not always start from 0
    //other option is to use vector<long> c(max-min) and substruct min when copy to/from it.
    //like this: vector<long> c(1+max-min); //initialize size = max-min+1
    //           c[k-min] = arr[i];
    //           arr[i] = c[i-min];
    i=min,j=mid+1;
    k=min;

    while(i<=mid && j<=max){
        if(arr[i]<arr[j]){
            c[k]=arr[i];
            i++;
            k++;
        }
        else{
            c[k]=arr[j];
            j++;
            k++;
        }
    }
    while(i<=mid){
        c[k]=arr[i];
        i++;
        k++;
    }
    while(j<=max){
        c[k]=arr[j];
        j++;
        k++;
    }

    for(long i=min;i<=max;i++)
        arr[i]=c[i];
}

void create_input(int i){
    srand(time(NULL));
    ofstream fout("sample2.txt");
    while(i--){
        fout<<rand()<<" ";
    }
} 

int main(){

    vector<long> data;
    long tmp;
    long count=0;
    //create random input
    //create_input(31);

    ifstream fin("sample2.txt");

    while(fin >> tmp)
    {
        data.push_back(tmp);
        count++;//count = data.size(); !!
    }
    cout<<"the unsorted array is\n";
    for(long i=0;i<count;i++)
        cout<<i<<"]\t"<<data[i]<<"\n";

    divide(data,0,count-1);//use last index not size

    cout<<"the sorted array is\n";
    for(long i=0;i<count;i++)
        cout<<i<<"]\t"<<data[i]<<"\n";


    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
无效合并(向量和,长,长,长);
无效分割(矢量和arr、最小长、最大长){
长中;

如果(Min您遇到了哪些具体错误?程序何时或如何停止?请澄清您遇到的问题!这不是错误,而是症状。使用调试器逐步检查代码,看看它做得对,哪里出了错。此外,正如@GingerPlusPlus提到的,您应该学会适当地缩进代码,以及标准代码格式,因为您提供给我们的代码阅读起来很痛苦!这不仅仅是为了这个问题;学习如何以适当的方式格式化代码很重要。如果您这样做,您将更容易在代码中导航,其他人也更容易理解。谢谢您的回答。但这并没有解决我的问题问题是,我仍然停留在那里。为什么不使用向量而不是常量数组大小?目前它将文件限制为30个数字…尝试使用30个数字的文件,而不是31个数字的文件…我使用向量c;这是正确的方法吗?如果我给c[1000000],它就可以工作了但我认为这不是一个好方法。你能给我向量的语法吗?这不是答案,这是一个注释…这是一个答案,因为这就是正在发生的事情。长期的答案是重写代码,使它一次能做更小的块。一个好答案的关键是精确和有用。你的答案几乎不尊重第二点。
r程序导致堆栈溢出
在哪里?为什么?您可以建议如何解决或解决此问题?
#include <map>
#include <vector>
#include <fstream> 
#include <iostream> 
#include <time.h>
using namespace std;

void merge(vector<long> &,long ,long , long );


void divide(vector<long> &arr,long min, long max){
    long mid;

    if(min<max){
        mid=(min+max)/2;
        if(min != mid) divide(arr,min,mid);
        if(max != mid+1) divide(arr,mid+1,max);
        merge(arr,min,mid,max);
    }
    return;

}

void merge(vector<long> &arr,long min, long mid,long max){
    long i,j,k;
    map<long,long> c; //uses map because the vector not always start from 0
    //other option is to use vector<long> c(max-min) and substruct min when copy to/from it.
    //like this: vector<long> c(1+max-min); //initialize size = max-min+1
    //           c[k-min] = arr[i];
    //           arr[i] = c[i-min];
    i=min,j=mid+1;
    k=min;

    while(i<=mid && j<=max){
        if(arr[i]<arr[j]){
            c[k]=arr[i];
            i++;
            k++;
        }
        else{
            c[k]=arr[j];
            j++;
            k++;
        }
    }
    while(i<=mid){
        c[k]=arr[i];
        i++;
        k++;
    }
    while(j<=max){
        c[k]=arr[j];
        j++;
        k++;
    }

    for(long i=min;i<=max;i++)
        arr[i]=c[i];
}

void create_input(int i){
    srand(time(NULL));
    ofstream fout("sample2.txt");
    while(i--){
        fout<<rand()<<" ";
    }
} 

int main(){

    vector<long> data;
    long tmp;
    long count=0;
    //create random input
    //create_input(31);

    ifstream fin("sample2.txt");

    while(fin >> tmp)
    {
        data.push_back(tmp);
        count++;//count = data.size(); !!
    }
    cout<<"the unsorted array is\n";
    for(long i=0;i<count;i++)
        cout<<i<<"]\t"<<data[i]<<"\n";

    divide(data,0,count-1);//use last index not size

    cout<<"the sorted array is\n";
    for(long i=0;i<count;i++)
        cout<<i<<"]\t"<<data[i]<<"\n";


    return 0;
}