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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
#1

Память - C++

23.05.2012, 15:34. Просмотров 504. Ответов 11
Метки нет (Все метки)

Здравствуйте, пишу программу, суть такова:
Нужно строки из файла отсортировать по длине строки, а строки равной длины отсортировать по алфавиту.
Все работало, когда было фиксированное количество строк, но когда я начал количество строк выражать через 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;
а перебор по строкам делаю просто фиксированным (числом), то все начинает вновь работать как надо. Как можно толково сделать подсчет количества строк в файле?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.05.2012, 15:34
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Память (C++):

Статическая память,Динамическая память. - C++
a) Статическая память. Двумерный массив. Дан массив целых чисел. В массиве есть отрицательные числа. Определить координаты левого нижнего...

Realloc выделяет память для массива int и не выделяет память для массива double - C++
Скажите пожалуйста, почему вот этот код работает: #include &lt;iostream&gt; #include &lt;windows.h&gt; using namespace std; int main()...

Не выделяется память - C++
#include&lt;iostream&gt; #include&lt;stdio.h&gt; #include&lt;stdlib.h&gt; using namespace std; class DynArray { public: int size, end; int...

Разделяемая память - C++
Добрый день!!! Столкнулся вот с какой проблемой, мне необходимо написать программу крестики-нолики через разделяемую память. А как это...

Динамическая память [new] - C++
Если записать так: char *p; p = new char; cin&gt;&gt;p; for(int i=0; i&lt;strlen(p); i++) cout&lt;&lt;p&lt;&lt;endl;

Не освобождается память - C++
Мне надо сделать прогу,точнее переделать, с использованием динамического двумерного массива... Я не буду писать эту прогу в изночальном...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 15:46 #2
После подсчёта строк на начало файл перемотай.
1
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 15:50  [ТС] #3
Цитата Сообщение от Deviaphan Посмотреть сообщение
После подсчёта строк на начало файл перемотай.
Спасибо, помогло!
Только программа все равно циклится, но это уже с сортировками проблемы, думаю. Зато теперь нормально считывает строки.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 15:55 #4
Где и почему циклится, это в отладчике посмотри. Откровенных косяков не вижу вроде больше.
1
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
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 17:56 #6
Цитата Сообщение от paranoya Посмотреть сообщение
for (j=n;j>=(i+1);j--)
j=n это выход за границы массива.
Пыщ-пыщ.
0
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 18:21  [ТС] #7
Цитата Сообщение от Deviaphan Посмотреть сообщение
j=n это выход за границы массива.
Пыщ-пыщ.
Я уже сделал j=(n-1), но все равно сортировка работает неправильно. Глаз уже замылен, ничего понять не могу.

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

Приведи текущий код, но используя блок кода, а не ссылку. Не убду ничего качать.
0
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, а в последней строке - нет, и посоветовали добавить в конец пустую строку. Все начал сортировать нормально, вот только теперь он везде добавляет эту пустую строку в самое начало. В принципе, не страшно, но все равно неприятно.
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 20:02 #10
Цитата Сообщение от paranoya Посмотреть сообщение
вот только теперь он везде добавляет эту пустую строку в самое начало
Ну так удали строку n=n+1;
0
paranoya
0 / 0 / 0
Регистрация: 15.05.2012
Сообщений: 9
23.05.2012, 20:08  [ТС] #11
Цитата Сообщение от Deviaphan Посмотреть сообщение
Ну так удали строку n=n+1;
Спасибо еще раз :3
Прошу прощения за нетерпеливость, просто нервный я нынче какой-то.
Спасибо большое!
0
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1287 / 1221 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
23.05.2012, 20:10 #12
Прощаю. Перед летними каникулами все куда-то спещат...
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 20:10
Привет! Вот еще темы с ответами:

Выделяется ли память? - C++
Доброе время суток! У меня есть BYTE *pOutData = NULL; Объясните пожалуйста что происходит в следующем: strcpy(cToken, &quot;Задан...

Динамическая память с++ - C++
Как использовать динамическую память в с++

Указатели и память - C++
Народ как указателю присвоить определённый адрес? P.S. Цитирую задание &quot;Пользуясь указателями выдать на печать адреса этих символов и...

Память компьютера - C++
Добрый вечер. Можете ли по подробнее рассказать о памяти компьютера? Как компьютер хранит переменные? Что такое адрес? И почему этот адрес...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
23.05.2012, 20:10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru