Форум программистов, компьютерный форум CyberForum.ru

Память - C++

Восстановить пароль Регистрация
 
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 15:34     Память #1
Здравствуйте, пишу программу, суть такова:
Нужно строки из файла отсортировать по длине строки, а строки равной длины отсортировать по алфавиту.
Все работало, когда было фиксированное количество строк, но когда я начал количество строк выражать через n, все почему-то работать перестало - циклится и выводит вместо нужных строк рандомные символы.
Подскажите, пожалуйста, в чем может быть проблема?
Архив с файлами: http://rghost.ru/38236986

Код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
 
main()
{ int n=0,i,j,len1, len2;
  char bufc;
  char bufer [200];
  FILE *pf, *pr;  
  pf=fopen("1.txt","r"); 
  pr=fopen("2.txt","w");
  while (!feof(pf)){
        if (fgetc(pf) == '\n') {
                 n++;
        }
  }
  n=n+1;
  printf("%d\n\n\n",n);
  char ** ptr = new char*[n];
  for (i = 0; i < n; i++) 
    ptr[i] = new char[20];
  for (i=0;i<n;i++) {
  fgets(ptr[i],20,pf);} 
  for (i=0;i<n;i++) {
      printf("%d; %s\n",i,ptr[i]);}   
  for (i=0;i<n-1;i++){
      for (j=n;j>=(i+1);j--){
      len1 = strlen(ptr[j]);
      len2 = strlen(ptr[j-1]);
      if (len1 < len2){
         strcpy(bufer, ptr[j-1]);
         strcpy(ptr[j-1],ptr[j]);
         strcpy(ptr[j],bufer);
         }
      }
  }   
  for (i=0;i<n-1;i++){
      for (j=n;j>=(i+1);j--){
          len1 = strlen(ptr[j]);
          len2 = strlen(ptr[j-1]);
          if (len1 == len2){
               if(strcmp(ptr[j-1],ptr[j])>0){
                       strcpy(bufer, ptr[j-1]);
                       strcpy(ptr[j-1],ptr[j]);
                       strcpy(ptr[j],bufer);
              }
          }
      }
  }
  for (i=0;i<n;i++) {
      printf("%d; %s\n",i,ptr[i]);}   
      
  system("PAUSE");
}
Добавлено через 15 минут
Когда исключаю из программы вот этот кусок:
C++
1
2
3
4
5
6
  while (!feof(pf)){
        if (fgetc(pf) == '\n') {
                 n++;
        }
  }
  n=n+1;
а перебор по строкам делаю просто фиксированным (числом), то все начинает вновь работать как надо. Как можно толково сделать подсчет количества строк в файле?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 15:34     Память
Посмотрите здесь:

C++ Указатели и память
Статическая память,Динамическая память. C++
C++ Динамическая память [new]
Разделяемая память C++
C++ Не освобождается память
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 15:46     Память #2
После подсчёта строк на начало файл перемотай.
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 15:50  [ТС]     Память #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
После подсчёта строк на начало файл перемотай.
Спасибо, помогло!
Только программа все равно циклится, но это уже с сортировками проблемы, думаю. Зато теперь нормально считывает строки.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 15:55     Память #4
Где и почему циклится, это в отладчике посмотри. Откровенных косяков не вижу вроде больше.
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 17:47  [ТС]     Память #5
Теперь еще печальная проблема - у меня одна из строк при сортировке постоянно вылазит не на свое место.
Вот пример: http://rghost.ru/38238606
11 строка.

Подскажите :3

Добавлено через 16 минут
Бамп 1

Добавлено через 11 минут
Бамп 2

Добавлено через 23 минуты
Бамп 3

Добавлено через 26 минут
Бамп 4
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 17:56     Память #6
Цитата Сообщение от paranoya Посмотреть сообщение
for (j=n;j>=(i+1);j--)
j=n это выход за границы массива.
Пыщ-пыщ.
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 18:21  [ТС]     Память #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
j=n это выход за границы массива.
Пыщ-пыщ.
Я уже сделал j=(n-1), но все равно сортировка работает неправильно. Глаз уже замылен, ничего понять не могу.

Добавлено через 12 минут
Бамп 1.
 Комментарий модератора 
Если на ваш вопрос долгое время нет ответа, уточните его, приведите дополнительные сведения, которые могут помочь участникам форума решить вашу проблему.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 18:50     Память #8
Цитата Сообщение от paranoya Посмотреть сообщение
Если на ваш вопрос долгое время нет ответа...
А ещё у некоторых есть личная жизнь, поэтому ответы даются по мере возможности.

Приведи текущий код, но используя блок кода, а не ссылку. Не убду ничего качать.
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 19:52  [ТС]     Память #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
А ещё у некоторых есть личная жизнь, поэтому ответы даются по мере возможности.

Приведи текущий код, но используя блок кода, а не ссылку. Не убду ничего качать.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
 for (i=0;i<n-2;i++){
      for (j=n-1;j>i;j--){
          len1 = strlen(ptr[j]);
          len2 = strlen(ptr[j-1]);
          if (len1 == len2){
               if(strcmp(ptr[j-1],ptr[j])>0){
                       strcpy(bufer, ptr[j]);
                       strcpy(ptr[j],ptr[j-1]);
                       strcpy(ptr[j-1],bufer);
              }
          }
      }
  }
В принципе мне уже подсказали, что дело в том, что строки у меня оканчиваются на \n, а в последней строке - нет, и посоветовали добавить в конец пустую строку. Все начал сортировать нормально, вот только теперь он везде добавляет эту пустую строку в самое начало. В принципе, не страшно, но все равно неприятно.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 20:02     Память #10
Цитата Сообщение от paranoya Посмотреть сообщение
вот только теперь он везде добавляет эту пустую строку в самое начало
Ну так удали строку n=n+1;
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 20:08  [ТС]     Память #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ну так удали строку n=n+1;
Спасибо еще раз :3
Прошу прощения за нетерпеливость, просто нервный я нынче какой-то.
Спасибо большое!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 20:10     Память
Еще ссылки по теме:

Не выделяется память C++
C++ Динамическая память с++
C++ Выделяется ли память?

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 20:10     Память #12
Прощаю. Перед летними каникулами все куда-то спещат...
Yandex
Объявления
23.05.2012, 20:10     Память
Ответ Создать тему
Опции темы

Текущее время: 22:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru