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

Выделение памяти под строку. Замкнутый круг - C++

Восстановить пароль Регистрация
 
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
02.06.2013, 09:03     Выделение памяти под строку. Замкнутый круг #1
Здравствуйте!
Программе подается текстовый файл. Надо его считывать построчно, и загонять в массив. То есть каждой строке должен соответствовать массив. Динамический. Используя malloc.

И я не понимаю: для того, чтобы создать динамический массив нужно узнать длину строки. Чтобы узнать длину, нужно строку считать, то есть создать массив. Замкнутый круг.

Помогите, пожалуйста, объясните!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.06.2013, 09:03     Выделение памяти под строку. Замкнутый круг
Посмотрите здесь:

C++ выделение памяти под переменную
Выделение памяти под матрицу C++
Выделение памяти под строку C++
Выделение памяти под массив C++
C++ выделение памяти под структуру
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
edward_jonson
 Аватар для edward_jonson
157 / 157 / 25
Регистрация: 23.02.2011
Сообщений: 388
02.06.2013, 09:16     Выделение памяти под строку. Замкнутый круг #2
Сначала посчитай длину, перемотай на начало строки(вроде так:
C++
1
fseek(file, -length, SEEK_CUR);
), где file - указатель на файл, length - длина строки), и считывай в массив.
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
02.06.2013, 09:43  [ТС]     Выделение памяти под строку. Замкнутый круг #3
edward_jonson, но... как я подсчитаю длину?..
edward_jonson
 Аватар для edward_jonson
157 / 157 / 25
Регистрация: 23.02.2011
Сообщений: 388
02.06.2013, 09:51     Выделение памяти под строку. Замкнутый круг #4
C++
1
2
3
int length = 0;
/* ... */
while( fgetc(file) != '\n' ) length ++;
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.06.2013, 10:01     Выделение памяти под строку. Замкнутый круг #5
используйте std::string и std::getline. Зачем изобретать велосипед? (к тому же с malloc)
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
02.06.2013, 20:01  [ТС]     Выделение памяти под строку. Замкнутый круг #6
Tulosba, а мне нельзя, условия преподавателя)
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
02.06.2013, 20:30     Выделение памяти под строку. Замкнутый круг #7
ilizard, ну тогда читайте посимвольно, как Вам предложили уже.
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
02.06.2013, 21:02  [ТС]     Выделение памяти под строку. Замкнутый круг #8
edward_jonson, спасибо вам большое, очень сильно помогли!!!

Добавлено через 18 минут
Tulosba, ой, а можно еще вопрос? после того как я считала посимвольно, создала массив, я не могу же просто заново считать строку?
C
1
2
3
4
5
   int length = 0;
   while( fgetc(input) != '\n' ) length ++;
   char* a = (char) malloc(length+1);
  
   fscanf(input, "%s", a);
в этом случае каретка уже будет на 2 строке? ее переносить надо?

Добавлено через 1 минуту
Tulosba, ой, а можно еще вопрос?
После того как я считала посимвольно, узнала длину, создала массив... я ведь не могу считать заново строку? каретка ведь будет на другой строке уже? ее надо перенести, как?
вот:
C
1
2
3
4
5
int length = 0;
   while( fgetc(input) != '\n' ) length ++;
   char* a = (char) malloc(length+1);
  
   fscanf(input, "%s", a);
Добавлено через 8 секунд
Tulosba, ой, а можно еще вопрос?
После того как я считала посимвольно, узнала длину, создала массив... я ведь не могу считать заново строку? каретка ведь будет на другой строке уже? ее надо перенести, как?
вот:
C
1
2
3
4
5
int length = 0;
   while( fgetc(input) != '\n' ) length ++;
   char* a = (char) malloc(length+1);
  
   fscanf(input, "%s", a);
Добавлено через 37 секунд
упс, глюк, простите.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
02.06.2013, 21:22     Выделение памяти под строку. Замкнутый круг #9
Сначала посчитайте количество строк в файле. Создайте динамический массив указателей под строки. Сделайте rewind(). Потом считывайте посимвольно каждую строку, создавайте массив под символы, помещайте указатель на него в массив указателей. Так весь файл. Потом опять rewind() и читать строки в созданный массив.
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
03.06.2013, 00:50  [ТС]     Выделение памяти под строку. Замкнутый круг #10
edward_jonson, вот так почему то не работает:
C
1
2
3
4
5
6
7
8
9
   int length = 0;
   while( fgetc(input) != '\n' ) length ++;
   char* a = (char*) malloc(length+1);
   
   fseek(input, -length, SEEK_CUR);
   
   
   fscanf(input, "%s", a);
   obr_str(a);
почему?

Добавлено через 1 час 16 минут
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
end=0;
   shet=0;
   char a[20];
   
  fscanf(input, "%s", a);
  
  while (end==0) 
    {      
           shet++;
           for (i=0; i<20; i++)
               if (a[i] == '\n')
                  end=i;
           
    }
    
    length = (shet-1)*20 + end;
еще так пробовала. тоже не работает. Здесь из за того что не находит конец строки... '\n' то есть)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2013, 02:23     Выделение памяти под строку. Замкнутый круг #11
C++
1
2
3
4
5
6
7
int length = 0;
while( fgetc(input) != '\n' ) length++;
char* a = (char*) malloc(length + 1);
   
fseek(input, -(length + 1), SEEK_CUR);
       
fgets(a, length + 1, input);
ilizard
0 / 0 / 0
Регистрация: 03.12.2012
Сообщений: 50
03.06.2013, 03:02  [ТС]     Выделение памяти под строку. Замкнутый круг #12
alsav22, не работает, почему то. так уже пробовала.
Вот так еще пробовала:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
end=0;
   shet=0;
   char a[20];
   
  fscanf(input, "%s", a);
  
  while (end==0) 
    {      
           shet++;
           for (i=0; i<20; i++)
               if (a[i] == '\n')
                  end=i;
           
    }
    
    length = (shet-1)*20 + end;
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2013, 03:14     Выделение памяти под строку. Замкнутый круг #13
У меня работает. Я же не вижу как вы пробуете, что у вас не работает. По куску кода это не понять.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2013, 03:22     Выделение памяти под строку. Замкнутый круг #14
Вот код и результат:
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
#include <stdio.h>
#include <fstream>
#include <iostream> 
using namespace std;
 
int main()
{
    FILE* input = fopen("file.txt", "r");
    if (input)
    {
        int length = 0;
    
        while( fgetc(input) != '\n' ) length++;
    
        char* a = (char*) malloc(length + 1);
   
        fseek(input, -(length + 2), SEEK_CUR);
       
        fgets(a, length + 1, input);
        printf("%s\n", a);
    }
    
    system("pause");
    return 0;
}
В файле: 0123456789\n
Миниатюры
Выделение памяти под строку. Замкнутый круг  
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.06.2013, 03:40     Выделение памяти под строку. Замкнутый круг
Еще ссылки по теме:

Бесконечный замкнутый круг программы и цвет C++
ООП Классы. Выделение памяти под строку char* C++
выделение памяти под структуру C++

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
03.06.2013, 03:40     Выделение памяти под строку. Замкнутый круг #15
А лучше так (открывать для бинарного чтения, тогда fgetc() и fseek() будут одинаково обрабатывать символ новой строки):
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
#include <stdio.h>
#include <fstream>
#include <iostream> 
using namespace std;
 
int main()
{
    FILE* input = fopen("file.txt", "rb");
    if (input)
    {
        int length = 0;
    
        while( fgetc(input) != '\n' ) length++;
    
        char* a = (char*) malloc(length + 1);
   
        fseek(input, -(length + 1), SEEK_CUR);
       
        fgets(a, length + 1, input);
        printf("%s\n", a);
    }
    
    system("pause");
    return 0;
}
Yandex
Объявления
03.06.2013, 03:40     Выделение памяти под строку. Замкнутый круг
Ответ Создать тему
Опции темы

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