Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.12.2010, 17:37   #1
ХреновыйПрогер
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 16
По умолчанию Выделить память под структуру.

Помогите выделить память под структуру..

Код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#define N 10

typedef struct _base
{
char name[50];
char lastname[50];
char fname[50];
int matan;
int lin;
int fizika;
int prog;
} base;

void main(void)
{
FILE *fp;
char i=0, n;
double sred;
char fname[128];
struct _base *base = (struct _base*)malloc(sizeof(struct _base)); // выделит памяти под 1 структуру

setlocale(LC_ALL,"Russian");

printf("Введите имя файла: ");
gets(fname);

if((fp=fopen(fname, "rt"))==NULL) 
{
printf("He удается открыть файл.\n");
exit(0);
}

printf("\n");

while (!feof(fp))  /*feof() проверяет, достигнут ли конец файла */
{
n=i;
fscanf(fp,"%[^,]%*c %[^,]%*c %[^,]%*c %[^,]%*c %d%*c %d%*c %d%*c %d",base[i].lastname, base[i].name, base[i].fname, &base[i].matan, &base[i].lin, &base[i].fizika, &base[i].prog);
i++;
}

fclose(fp); 

for(i=0;i<n+1;i++)
{

printf("%12s", base[i].lastname);
printf("%3c.%c.",base[i].name[0], base[i].fname[0]);
sred = base[i].fizika-'0'+base[i].matan+base[i].fizika+base[i].prog;  //из кода символа вычитается код символа 0
sred=sred/4;

if(sred>=4)
printf(" %2.f\n", sred);
else
printf(" %4.1f !!!!!!!!!!\n", sred);
} 

printf("\n");
}
я вроде выделяю, но прога падает сразу же при запуске...
ХреновыйПрогер вне форума Ответить с цитированием
Старый 26.12.2010, 17:47   #2
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

память нормально выделяется, ищи косяки дальше по коду.

ЗЫ:

если пишешь на си с плюсами, то вместо
struct _base *base = (struct _base*)malloc(sizeof(struct _base));
пиши
_base *base = new _base;
и не забывай в конце проги писать delete base;
UltimaBeaR вне форума Ответить с цитированием
Старый 26.12.2010, 17:49   #3
ХреновыйПрогер
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 16
По умолчанию

Подскажи где может быть ошибка? я уже весь код просмотрел..
Понял ошибка в fscanf

Последний раз редактировалось ХреновыйПрогер; 26.12.2010 в 17:52.
ХреновыйПрогер вне форума Ответить с цитированием
Старый 26.12.2010, 17:51   #4
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

незнаю у меня твоего файла нету чтоб проверить
UltimaBeaR вне форума Ответить с цитированием
Старый 26.12.2010, 17:55   #5
ХреновыйПрогер
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 16
По умолчанию

Петров,Владимир,Владимирович,4,4,4, 4
Иванов,Иван,Иванович,3,4,3,5
Сидоров,Генадий,Александрович,5,5,5 ,5
Петров,Василий,Алибабаевич,2,2,2,2
ХреновыйПрогер вне форума Ответить с цитированием
Старый 26.12.2010, 18:08   #6
UltimaBeaR
Форумчанин
 
Аватар для UltimaBeaR
 
Регистрация: 21.12.2010
Сообщений: 199
По умолчанию

Учись юзать отладчик

на чтении файла у тебя никогда не выполняется !feof(fp). цикл зацикливается, видимо както ты читаешь не так
UltimaBeaR вне форума Ответить с цитированием
Старый 26.12.2010, 18:17   #7
ХреновыйПрогер
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 16
По умолчанию

блин всё попробовал. Лдн буду пробовать хоть через пробел прочесть.
ХреновыйПрогер вне форума Ответить с цитированием
Старый 26.12.2010, 18:35   #8
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Ну так - выделили память под один экземпляр структуры, а работать пытаетесь с массивом структур.
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 26.12.2010, 18:50   #9
ХреновыйПрогер
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 16
По умолчанию

Надо тогда в цикл когда считываю добавить что то вроде этого?
base = realloc(base, sizeof(struct _base)*i)
ХреновыйПрогер вне форума Ответить с цитированием
Старый 26.12.2010, 19:00   #10
ХреновыйПрогер
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 16
По умолчанию

Код:
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>


typedef struct _base
{
char name[50];
char lastname[50];
char fname[50];
int matan;
int lin;
int fizika;
int prog;
} base;

void main(void)
{
FILE *fp;
char i=0, n;
double sred;
char fname[128];
struct _base *base = (struct _base*)malloc(sizeof(struct _base)); // выделит памяти под 1 структуру

setlocale(LC_ALL,"Russian");

printf("Введите имя файла: ");
gets(fname);

if((fp=fopen(fname, "rt"))==NULL) 
{
printf("He удается открыть файл.\n");
exit(0);
}

printf("\n");

while (!feof(fp))  /*feof() проверяет, достигнут ли конец файла */
{
n=i;
fscanf(fp,"%s %s %s %d %d %d %d",base[i].lastname, base[i].name, base[i].fname, &base[i].matan, &base[i].lin, &base[i].fizika, &base[i].prog);
i++;
base = realloc(base,sizeof(struct _base)*i);
}

fclose(fp); 

for(i=0;i<n+1;i++)
{

printf("%12s", base[i].lastname);
printf("%3c.%c.",base[i].name[0], base[i].fname[0]);
sred = base[i].fizika-'0'+base[i].matan+base[i].fizika+base[i].prog;  //из кода символа вычитается код символа 0
sred=sred/4;

if(sred>=4)
printf(" %2.f\n", sred);
else
printf(" %4.1f !!!!!!!!!!\n", sred);
} 


printf("\n");
}
Работает если только считывать символы , а строки не считывает

Последний раз редактировалось ХреновыйПрогер; 26.12.2010 в 19:25.
ХреновыйПрогер вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как выделить память 750mb? VintProg Общие вопросы Delphi 10 29.06.2009 20:30
динамически выделить память под верхний треугольник квадратной матрицы juventine Общие вопросы C/C++ 2 12.04.2009 13:06
как выделить память для указателя (pointer), и сюда же, записать : integer, потом через 4 байта, boolean? bigxman Общие вопросы Delphi 1 02.02.2009 21:17
Не могу выделить память для трёхмерного массива Blister Помощь студентам 3 19.12.2007 07:25
как под структуру типа MSG выделить строго определенное количество байт? Morskoivolk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 03.04.2007 20:12