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

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

Войти
Регистрация
Восстановить пароль
 
 
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
#1

Нужно перевести из С++ в C строку с выделением памяти в куче - C++

24.12.2012, 23:25. Просмотров 452. Ответов 15
Метки нет (Все метки)

Есть функция, для определения...что ли длинны записанного в файле.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int length()
{
    int len=0;
    Node tmp;
    if(!(f=fopen("1.txt","r")))
        puts("Файла не существует. Создайте файл");
    else
    while(!feof(f))
    {
        if((fscanf(f,"%s%d%d\n",tmp.surname,&tmp.year,&tmp.num)))
        len++;
    }
    fclose(f);
    return len;
}
Вот. И надо перевести из С++ в C вот эту строку с выделением памяти в куче.
C++
1
Node *ptr=new Node[len=length()];
Node - структура.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.12.2012, 23:25     Нужно перевести из С++ в C строку с выделением памяти в куче
Посмотрите здесь:

Нужно ли удалять указатель на символьный массив созданный в куче(динамически распределяемой памяти) - C++
Подскажите, программа состоит из 2 функций (main и fun), программа меняет значение указателя на символьный массив созданный в динамически...

Потоки и выделение памяти в куче - C++
Подскажите, кто знает, какие есть тонкости при выделении памяти в куче (new) в потоках отличных от главного. У меня возникают исключения...

Указатели (Выделение памяти в куче) - C++
Чтобы создать в динамически распределяемой памяти переменную типа unsigned short необходимо написать следующее: unsigned short...

Динамическое выделение памяти. Ошибки в куче - C++
Функция чтения данных из ячейки экселя wchar_t *DataInCell( Excel::_WorksheetPtr Sheet, int Row, int Col ) Excel::RangePtr Cell; ...

ошибка с выделением памяти - C++
выдает ошибку в выделении памяти. никто не подскажет почему? если что -задача звучит так примерно вводим веественные числа пока не...

Проблема с выделением памяти - C++
Всем привет! Нужна помощь. Создаю класс и при компиляции возникает ошибка. Не пойму причину. Помогите пожалуйста. Конструктор должен...

Проблемы с выделением памяти - C++
Здравствуйте. Есть контейнер QList <Node *> В Node свой QList <Node *>. Строю программное дерево разбора выражение. На небольших...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
24.12.2012, 23:28     Нужно перевести из С++ в C строку с выделением памяти в куче #2
Цитата Сообщение от dkg_C Посмотреть сообщение
C++
1
Node *ptr=new Node[len=length()];
C
1
2
3
Node *ptr=malloc(sizeof(Node)*len);//Примерно так
//...
free(ptr);
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.12.2012, 23:34  [ТС]     Нужно перевести из С++ в C строку с выделением памяти в куче #3
Цитата Сообщение от Croessmah Посмотреть сообщение
C
1
2
3
Node *ptr=malloc(sizeof(Node)*len);//Примерно так
//...
free(ptr);
Так-то да, но не выходит.
Посмотрите пожалуйста.
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
#include <Windows.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
 
 
typedef struct node
{
    char surname[255];
    int year;
    int num;
}Node;
 
FILE *f;
 
int menu();
void add(Node&);
void show();
void find_year(int);
int length();
void change(int);
void deleterecord(int);
 
 
int main()
{
    int repeat;
    setlocale(LC_ALL,"");
    do
    {
        system("cls");
        switch(menu())
        {
            case 1:
                f=fopen("1.txt","a");
                Node str;
                addFile(str);
                fclose(f);
                break;
            case 2:
                viewFile();
                break;
            case 3:
                int year;
                puts("Введите год установки для определения количества установленных телефонов");
                scanf("%d",&year);
                runFile(year);
                break;
            case 4:
                show();
                int num;
                puts("Введите номер записи для редактирования");
                scanf("%d",&num);
                editFile(num);
                break;
            case 5:
                show();
                puts("Введите номер записи для удаления");
                scanf("%d",&num);
                deleterecord(num);
                break;
            case 0:
                return 0;
        }
        puts("Продолжить?    (1/0)");
        scanf("%d",&repeat);
    }
    while(repeat);
    return 0;
}
 
void deleterecord(int num)
{
    int len;
    Node *ptr=new Node[len=length()];
    if(!(f=fopen("1.txt","r")))
        puts("Нельзя создать файл.");
    else
    {
 
        for(int i=0;!feof(f);i++)
        fscanf(f,"%s%d%d\n", &ptr[i].surname, &ptr[i].year, &ptr[i].num);
        fclose(f);
        f=fopen("1.txt","w");
        for(int i=0;i<len;i++)
        {
            if(i!=(num-1))
                fprintf(f,"%s %d %d\n",ptr[i].surname,ptr[i].year,ptr[i].num);
        }
        fclose(f);
    }
}
void editFile(int num)
{
    int len;
    Node *ptr=new Node[len=length()];
    if(!(f=fopen("1.txt","r")))
        puts("Файла не существует. Создайте файл");
    else
    {
 
        for(int i=0;!feof(f);i++)
            fscanf(f,"%s%d%d\n",&ptr[i].surname,&ptr[i].year,&ptr[i].num);
        fclose(f);
        puts("Введите фамилию");
        scanf("%s",&ptr[num-1].surname);
        puts("Введите год подключения");
        scanf("%d",&ptr[num-1].year);
        puts("Введите номер");
        scanf("%d",&ptr[num-1].num);
        f=fopen("1.txt","w");
        for(int i=0;i<len;i++)
        fprintf(f,"%s %d %d\n",ptr[i].surname,ptr[i].year,ptr[i].num);
        fclose(f);
    }
}
int length()
{
    int len=0;
    Node tmp;
    if(!(f=fopen("1.txt","r")))
        puts("Файла не существует. Создайте файл");
    else
    while(!feof(f))
    {
        if((fscanf(f,"%s%d%d\n",&tmp.surname,&tmp.year,&tmp.num)))
        len++;
    }
    fclose(f);
    return len;
}
void runFile(int year)
{
    int t=0;
        if(!(f=fopen("1.txt","r")))
            puts("Файла не существует. Создайте файл");
        else
        {
            Node tmp;
            while(!feof(f))
            {
                fscanf(f,"%s%d%d\n",tmp.surname,&tmp.year,&tmp.num);
                if(tmp.year>=year)
                t++;
            }
            printf("%d\n", t);
        }
        fclose(f);
}
 
void viewFile()
{
        if(!(f=fopen("1.txt","r")))
            puts("Файла не существует. Создайте файл");
        else
        {
            Node tmp;
            int i=1;
            while(!feof(f))
            {
                fscanf(f,"%s%d%d\n",tmp.surname,&tmp.year,&tmp.num);
                printf("%d)  %s %d %d\n",i,tmp.surname,tmp.year,tmp.num);
                i++;
            }
        }
        fclose(f);
}
void addFile(Node &ptr)
{
    puts("Введите фамилию");
    scanf("%s",&ptr.surname);
    puts("Введите год подключения");
    scanf("%d",&ptr.year);
    puts("Введите номер");
    scanf("%d",&ptr.num);
    fprintf(f,"%s %d %d\n",ptr.surname,ptr.year,ptr.num);
    
}
int menu()
{   
    int pick;
    puts("1) Добавление записи");
    puts("2) Вывод всех записей на экран из файла");
    puts("4) Определение количества установленных телефонов с вводимого года");
    puts("5) Редактирование выбраной записи");
    puts("6) Удаление выбраной записи");
    puts("0) Выход");
    scanf("%d",&pick);
    return pick;
}
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
24.12.2012, 23:35     Нужно перевести из С++ в C строку с выделением памяти в куче #4
C++
1
void addFile(Node &ptr)
Ссылки - это механизм C++
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.12.2012, 23:36  [ТС]     Нужно перевести из С++ в C строку с выделением памяти в куче #5
Цитата Сообщение от Croessmah Посмотреть сообщение
C++
1
void addFile(Node &ptr)
Ссылки - это механизм C++
Нам по этому поводу ничего не говорили. Если не говорят, значит можно
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.12.2012, 23:39     Нужно перевести из С++ в C строку с выделением памяти в куче #6
Цитата Сообщение от Croessmah Посмотреть сообщение
Node *ptr=malloc(sizeof(Node)*len);//Примерно так
Только не забывайте, что malloc вернет void*, а значит нужно самому каставать.
И второе - он просто выделит заданный объем памяти в куче, но конструктор не вызовет.
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.12.2012, 23:40  [ТС]     Нужно перевести из С++ в C строку с выделением памяти в куче #7
Цитата Сообщение от go Посмотреть сообщение
Только не забывайте, что malloc вернет void*, а значит нужно самому каставать.
И второе - он просто выделит заданный объем памяти в куче, но конструктор не вызовет.
Компилятор по этому поводу возмущался кстати.
Что сделать то?
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
24.12.2012, 23:44     Нужно перевести из С++ в C строку с выделением памяти в куче #8
Цитата Сообщение от dkg_C Посмотреть сообщение
Если не говорят, значит можно
Тогда зачем переводить под Си? Имхо, бред получается.

Не хватает прототипов перед main
C++
1
2
3
4
void addFile(Node&);
void viewFile();
void editFile(int);
void runFile(int);
Так же где реализация функции show?

Добавлено через 1 минуту
Цитата Сообщение от go Посмотреть сообщение
Только не забывайте, что malloc вернет void*, а значит нужно самому каставать.
И второе - он просто выделит заданный объем памяти в куче, но конструктор не вызовет.
Ну так переводим под Си, там же разрешено неявное преобразования void.
А в Си нужно вызывать конструктор для структур?
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.12.2012, 23:46  [ТС]     Нужно перевести из С++ в C строку с выделением памяти в куче #9
Сейчас изменю, я убирал ненужное.
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
24.12.2012, 23:49     Нужно перевести из С++ в C строку с выделением памяти в куче #10
Цитата Сообщение от Croessmah Посмотреть сообщение
Ну так переводим под Си,
Цитата Сообщение от Croessmah Посмотреть сообщение
Node *ptr=malloc(sizeof(Node)*len);//Примерно так
Тогда нужно слово struct писать.
C
1
struct Node *ptr =  malloc(sizeof Node * len);
Цитата Сообщение от Croessmah Посмотреть сообщение
там же разрешено неявное преобразования void.
Правило хорошего тона))

Цитата Сообщение от Croessmah Посмотреть сообщение
А в Си нужно вызывать конструктор для структур?
Очевидно, что там и ООП нет, но
Тогда нужно слово struct писать.
Croessmah
Модератор
Эксперт CЭксперт С++
13063 / 7326 / 817
Регистрация: 27.09.2012
Сообщений: 18,085
Записей в блоге: 3
Завершенные тесты: 1
24.12.2012, 23:55     Нужно перевести из С++ в C строку с выделением памяти в куче #11
Цитата Сообщение от go Посмотреть сообщение
Тогда нужно слово struct писать.
Действительно.
А вообще, тут все смешано - и Си и Си++
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
24.12.2012, 23:56  [ТС]     Нужно перевести из С++ в C строку с выделением памяти в куче #12
Ничего не получилось)
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <Windows.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>
 
 
typedef struct node
{
    char surname[255];
    int year;
    int num;
}Node;
 
FILE *f;
 
int menu();
void addFile(Node&);
void viewFile();
void runFile(int);
int length();
void editFile(int);
void deleterecord(int);
 
int main()
{
    int repeat;
    setlocale(LC_ALL,"");
    do
    {
        system("cls");
        switch(menu())
        {
            case 1:
                f=fopen("1.txt","a");
                Node str;
                addFile(str);
                fclose(f);
                break;
            case 2:
                viewFile();
                break;
            case 3:
                int year;
                puts("Введите год установки для определения количества установленных телефонов");
                scanf("%d",&year);
                runFile(year);
                break;
            case 4:
                viewFile();
                int num;
                puts("Введите номер записи для редактирования");
                scanf("%d",&num);
                editFile(num);
                break;
            case 5:
                viewFile();
                puts("Введите номер записи для удаления");
                scanf("%d",&num);
                deleterecord(num);
                break;
            case 0:
                return 0;
        }
        puts("Продолжить?    (1/0)");
        scanf("%d",&repeat);
    }
    while(repeat);
    return 0;
}
 
void deleterecord(int num)
{
    int len;
    struct Node *ptr =  malloc(sizeof(Node) * len);
    if(!(f=fopen("1.txt","r")))
        puts("Нельзя создать файл.");
    else
    {
 
        for(int i=0;!feof(f);i++)
        fscanf(f,"%s%d%d\n", &ptr[i].surname, &ptr[i].year, &ptr[i].num);
        fclose(f);
        f=fopen("1.txt","w");
        for(int i=0;i<len;i++)
        {
            if(i!=(num-1))
                fprintf(f,"%s %d %d\n",ptr[i].surname,ptr[i].year,ptr[i].num);
        }
        fclose(f);
    }
}
void editFile(int num)
{
    int len;
    struct Node *ptr =  malloc(sizeof(Node) * len);
    if(!(f=fopen("1.txt","r")))
        puts("Файла не существует. Создайте файл");
    else
    {
 
        for(int i=0;!feof(f);i++)
            fscanf(f,"%s%d%d\n",&ptr[i].surname,&ptr[i].year,&ptr[i].num);
        fclose(f);
        puts("Введите фамилию");
        scanf("%s",&ptr[num-1].surname);
        puts("Введите год подключения");
        scanf("%d",&ptr[num-1].year);
        puts("Введите номер");
        scanf("%d",&ptr[num-1].num);
        f=fopen("1.txt","w");
        for(int i=0;i<len;i++)
        fprintf(f,"%s %d %d\n",ptr[i].surname,ptr[i].year,ptr[i].num);
        fclose(f);
    }
}
int length()
{
    int len=0;
    Node tmp;
    if(!(f=fopen("1.txt","r")))
        puts("Файла не существует. Создайте файл");
    else
    while(!feof(f))
    {
        if((fscanf(f,"%s%d%d\n",&tmp.surname,&tmp.year,&tmp.num)))
        len++;
    }
    fclose(f);
    return len;
}
void runFile(int year)
{
    int t=0;
        if(!(f=fopen("1.txt","r")))
            puts("Файла не существует. Создайте файл");
        else
        {
            Node tmp;
            while(!feof(f))
            {
                fscanf(f,"%s%d%d\n",tmp.surname,&tmp.year,&tmp.num);
                if(tmp.year>=year)
                t++;
            }
            printf("%d\n", t);
        }
        fclose(f);
}
 
void viewFile()
{
        if(!(f=fopen("1.txt","r")))
            puts("Файла не существует. Создайте файл");
        else
        {
            Node tmp;
            int i=1;
            while(!feof(f))
            {
                fscanf(f,"%s%d%d\n",tmp.surname,&tmp.year,&tmp.num);
                printf("%d)  %s %d %d\n",i,tmp.surname,tmp.year,tmp.num);
                i++;
            }
        }
        fclose(f);
}
void addFile(Node &ptr)
{
    puts("Введите фамилию");
    scanf("%s",&ptr.surname);
    puts("Введите год подключения");
    scanf("%d",&ptr.year);
    puts("Введите номер");
    scanf("%d",&ptr.num);
    fprintf(f,"%s %d %d\n",ptr.surname,ptr.year,ptr.num);
    
}
int menu()
{   
    int pick;
    puts("1) Добавление записи");
    puts("2) Вывод всех записей на экран из файла");
    puts("4) Определение количества установленных телефонов с вводимого года");
    puts("5) Редактирование выбраной записи");
    puts("6) Удаление выбраной записи");
    puts("0) Выход");
    scanf("%d",&pick);
    return pick;
}
MrGluck
Модератор
Эксперт CЭксперт С++
7189 / 4355 / 634
Регистрация: 29.11.2010
Сообщений: 11,851
25.12.2012, 00:05     Нужно перевести из С++ в C строку с выделением памяти в куче #13
dkg_C, Что не получилось? Где не получилось? Я не вижу текста ошибок.
Нужно на С - замените расширение файла на .c На ссылки оно само буркнет.
Не вижу приведения памяти, выделенной malloc-ом.
dkg_C
8 / 8 / 1
Регистрация: 17.09.2012
Сообщений: 144
25.12.2012, 00:08  [ТС]     Нужно перевести из С++ в C строку с выделением памяти в куче #14
В общем, плюну на этот бред.
Сделаю на крестах.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.12.2012, 00:20     Нужно перевести из С++ в C строку с выделением памяти в куче
Еще ссылки по теме:

Конструктор с выделением памяти - C++
Среди всех данных есть указатель, память для которого выделяется в конструкторе, необходимый размер передается в параметрах конструктора....

Как происходит процесс выделения памяти в стеке и куче - C++
#include &lt;stdio.h&gt; #include &lt;conio.h&gt; #include &lt;windows.h&gt; #include &quot;disc.h&quot; void main() { SetConsoleCP(1251); ...

Работа со строками и выделением памяти - C++
Задание написать класс строк (что-то типа String). #define MAX 100 class ascii { private: char* str; int len; ...

Задача на строки с выделением памяти - C++
Добрый вечер, помогите с задачкой Выводит на экран только строки, состоящие из заданного количества слов. Возвращает количество прочих...

Строки с выделением динамической памяти - C++
Привет всем! Помогите решить вот такую задачу: Ввести две строки. Определить совпадение их слов (Первое слово 1 строки сравнить с первым...


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

Или воспользуйтесь поиском по форуму:
go
Эксперт C++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
25.12.2012, 00:20     Нужно перевести из С++ в C строку с выделением памяти в куче #15
Цитата Сообщение от Croessmah Посмотреть сообщение
Действительно.
если используется typedef, то этого делать не нужно
Цитата Сообщение от dkg_C Посмотреть сообщение
typedef struct node
Но в первом посте ТС об этом не сказано ни слова. Поэтому мы с вами об этом даже не догадывались.
Yandex
Объявления
25.12.2012, 00:20     Нужно перевести из С++ в C строку с выделением памяти в куче
Ответ Создать тему
Опции темы

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