2013-10-13 3 views
0

Im работает над программой для ввода входного файла, сортировки и печати вывода. Эти входные файлы будут иметь 10, 100, 1000 или 100000 строк, каждая из которых имеет номер в строке.C++ номера в файле массиву

Прямо сейчас мой код работает только для первых 10 строк.

основная часть

int array[10]; 
int size; 
size = sizeof array/sizeof(int); 

и

if(file.is_open()) 
    { 

     for(int i = 0; i < size ; ++i) 
     { 
      file >> array[i]; 
     } 
    } 

читать строки файла в массив.

Как это изменить, чтобы принимать переменные длины размеров строк и читать их в массиве.

#include<iostream> 

#include<string> 
#include<fstream> 
#include<vector> 
#include<ctime> 
using namespace std; 


void insertion_sort(int x[],int length) 
{ 
    int key,i; 
    for(int j=1;j<length;j++) 
    { 
    key=x[j]; 
    i=j-1; 
    while(x[i]>key && i>=0) 
    { 
       x[i+1]=x[i]; 
     i--; 
    } 
    x[i+1]=key; 
    } 
} 


int main() 
{ 

int array[10]; 
int size; 
size = sizeof array/sizeof(int); 
int x; 


char name[256]; 

string sort, order, dup; 


cout << "enter a file\n"; 
cin >> name; 

ofstream ofile; 
ifstream file(name); 


if(file.is_open()) 
    { 

     for(int i = 0; i < size ; ++i) 
     { 
      file >> array[i]; 
     } 
    } 
else{ 
      cout << "file doesnt exist"; 
      return 1; 
     } 
size = sizeof array/sizeof(int); 
cout << "enter a sort method - type insertion_sort or merge_sort or quick_sort or counting_sort\n"; 
cin >> sort; 

cout << "Type 'dec' for non decreasing or 'inc' for increasing order\n"; 
cin >> order; 

cout << "Type yes or no to remove duplicates\n"; 
cin >> dup; 


if (sort == "insertion_sort") 

{ 

insertion_sort(array,size); 
cout << "\ninsertion sort"; 
} 


if (order == "dec" ) 
    for(int i=0;i<size/2;i++) 
       swap(array[i],array[size-i-1]); 

if(dup == "yes") 
    { 


    int i, j; 


    int NewLength = 1; 

    for(i=1; i< size; i++){ 

     for(j=0; j< NewLength ; j++) 
     { 

      if(array[i] == array[j]) 
      break; 
     } 



     if (j==NewLength) 
      array[NewLength++] = array[i]; 
    } 

    } 




cout<<endl<<"sorted "<<endl; 
     for(x=0;x<size;x++) 
     { 
      cout<<array[x]<<endl; 
     } 




    return 0; 
    } 
+5

Вы, должно быть, считали 'std :: vector', правильно? –

ответ

2

Для начала, вы должны использовать std::vector и std::string вместо статических массивов. После того, как вы переключаете ваш код, чтобы использовать вектор, увлекая в файле целочисленных данных просто:

std::ifstream fin("myfile.dat"); 
std::vector<int> myVec; 
std::copy(std::istream_iterator<int>(fin), std::istream_iterator<int>(), std::back_inserter(myVec)); 

Что также делает вывод довольно простой:

std::ofstream fout("myNewFile.dat"); 
std::copy(myVec.begin(), myVec.end(), std::ostream_iterator<int>(fout, " ")); 
+4

... или даже проще, например: 'std :: vector myVec {std :: istream_iterator (fin), std :: istream_iterator ()};' –

+0

Или ... 'std :: multiset container { std :: istream_iterator (fin), std :: istream_iterator ()}; 'Сортировка: отсортировано! – Johnsyweb

+0

@Johnsyweb Учитывая, что это кажется домашним заданием, я сомневаюсь, что было бы приемлемо использовать его для сортировки автоматически. Но за пределами академических кругов, да. –

1

Что-то вроде

std::vector<int> vec; 
int x; 
while (file >> x) 
{ 
    vec.push_back(x); 
} 

может упростить вашу жизнь.

+1

Зачем писать свой собственный цикл, если у вас есть уже сделанный для вас? –

+1

@ ZacHowland Я поддержал ваш ответ! Я оставил это, потому что op - новичок, и это может быть легче понять. – Simon

+0

@ZacHowland Это был лучший ответ, чем дать ему решение. –

Смежные вопросы