C ++:无法从大文本文件中读取

时间:2014-09-16 18:35:20

标签: c++ input vector mergesort

我是c ++的新手。我为mergesort算法编写了一个代码。我的问题是我想从txt文件中读取100,000个整数作为输入, 我用较小的输入尝试了我的代码并且它有效。但是,当我使用大文件时,它会被停止。 我使用向量动态分配内存。 我使用long数据类型是否有任何错误? 我的代码:

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

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;
        divide(arr,min,mid);
        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;
    long c[30];

    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<k;i++)
        arr[i]=c[i];
}

int main(){

    vector<long> data;
    long tmp;
    long count=0;

    ifstream fin("sample2.txt");

    while(fin >> tmp)
    {
        data.push_back(tmp);
        count++;
    }

    divide(data,0,count);

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

    getch();

    return 0;
}

2 个答案:

答案 0 :(得分:0)

您的问题出在合并功能中:

你超过了本地变量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;
}

答案 1 :(得分:-2)

您的程序导致堆栈溢出