Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > ОТрывок программы


Автор: nefestim 2.4.2008, 21:15
<-------------------- Пометил вопросы.


Код

#include "stdafx.h"
#include <fstream>

#include <vector>
#include <string>
#include <algorithm>

using namespace std;

bool Mycompare ( string elem1, string elem2 )
{
    return elem1 > elem2;
}


int _tmain(int argc, _TCHAR* argv[])
{
/*
  ifstream c("input.txt");
  ofstream d("output2.txt");
  char e[255];
  char **aa, **bb; <------------------------------ что обозначают **
  int j, m;

// Первоначальное отведение памяти
  m=10;
  aa = new char*[m];

  int i=0;
  if (c.is_open()<------------------------------ что выполняет) {
    for (; !c.eof();) {
      c.getline(e, 254); <------------------------------ что выполняет
      aa[i]=new char[strlen(e)+1];
      strcpy(aa[i], e);
      i++;
      if (i>=m) {
// Отведение дополнительной памяти
        bb = new char*[m+10];
        for (j=0; j<m; j++) bb[j]=aa[j];
        m+=10;
        delete [] aa;
        aa = new char*[m];
        for (j=0; j<m-10; j++) aa[j]=bb[j];
        delete [] bb;  <---------------------------------- обязательно ли тут скобки [], почему?
      }
    }

// сортировка
    int n;
    char *w;
    for (int k=0; k<i-1; k++) {
      n=k;
      for (int l=k+1; l<i; l++) if (strcmp(aa[n], aa[l])<0) n=l;
      if (n>k) {
        w=aa[k];
        aa[k]=aa[n];
        aa[n]=w;
      }
    }
// вывод
    for (j=0; j<i; j++) d<<aa[j]<<endl;

// освобождение памяти
    for (j=0; j<i; j++) delete [] aa[j];
    delete [] aa;
  }
  c.close();
  d.close();
*/


// stl 

  ifstream c("input.txt");
  ofstream d("output1.txt");
  vector<string> aa;
  char ee[255];

//input
  if (c.is_open()) {
    while(!c.eof()) {
      c.getline(ee, 254);
      aa.push_back(ee); <------------------------------ что тут происходит?
    }
//    sort
    sort(aa.begin(), aa.end(), Mycompare);

//output
//    for (unsigned int j=0; j<aa.size(); j++) dd<<aa[j].c_str()<<endl;
    for (vector<string>::iterator j=aa.begin(); j!=aa.end(); j++) d<<(*j).c_str()<<endl;
  }
  c.close();
  d.close();

    return 0;
}



Автор: bsa 2.4.2008, 21:18
Ну отрывок, судя по всему, создавался по Microsoft Visual Studio. Дальше что?

Автор: nefestim 2.4.2008, 21:20
Извиняюсь чуть раньше выбросил текст

Автор: anatox91 2.4.2008, 21:48
например вот это
Код

delete [] bb;

надо именно так, потому что удаляется массив

Код

char **aa, **bb;

это указатели на указатели

Код

aa.push_back(ee);

массив ee помещается в конец вектора aa

Код

c.getline(e, 254);

получаем строку из файлового потока с и помещаем в символьный массив е

Код

c.is_open()

а тут наверно даже не надо знать программирование а просто англ.язык  smile 
наверно эта функция проверяет открыт ли файл  smile 

Автор: JackYF 3.4.2008, 21:01

M
JackYF
Потёр флуд и оффтопик.

Автор: opjox 3.4.2008, 21:54
Дополню:

Цитата(anatox91 @  2.4.2008,  21:48 Найти цитируемый пост)
надо именно так, потому что удаляется массив

Если вы использовали при выделении памяти [], то нужно использовать [] и при освобождении. 

Цитата(anatox91 @  2.4.2008,  21:48 Найти цитируемый пост)
это указатели на указатели

Вернее указатель на указатель типа char

Цитата(anatox91 @  2.4.2008,  21:48 Найти цитируемый пост)
получаем строку из файлового потока с и помещаем в символьный массив е

При этом считывая в e не более 254 символов.

Автор: inside_pointer 4.4.2008, 02:00
Код

char * a;    <=>    char a[];  
char ** a;    <=>    char * a[];  


Короче массив строк

Автор: opjox 4.4.2008, 20:24
Вот только если используются [], то размер должен быть указан явно или должна быть возможность его вычислить на этапе сборки. 
Код

char * p;
char s[]; // ошибка
char s1[] = "++"; // нормально
char s2[3]; // нормально


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)