Невозможно написать текст в текстовом файле с помощью цикла - PullRequest
0 голосов
/ 17 апреля 2020

Я пытаюсь записать текст в файл, используя циклы, но когда я делаю его как (ogrenci+i), используя i, а не как (ogrenci+0), я получаю некоторые странные числа и текст в текстовом файле.

При таком написании (ogrenci+0) работает правильно. Что я делаю не так?

Я обращаю внимание на указатель на struct в другой функции.

это вопрос ВОПРОСЫ

Предположим, что вам дана структура ниже

typedef struct StudentMark {
char name[20];
char surname[20];
int midterm;
int final;
}STUDENT_MARK;

1-) Запишите программу, которая содержит

a-) Функция для ввода введенного пользователем имени, фамилии и экзаменационных оценок в динамически распределяемую структуру STUDENT_MARK (ваша функция ДОЛЖНА проверять правильность ввода т. е. введенные метки должны быть между [0..100]).

b-) Функция для записи введенных структур VALID в файл с именем marks_YOUR_STUDENT_ID.txt.

2-) Запись программа, которая содержит

a-) Функция для чтения файла с именем marks_YOUR_STUDENT_ID.txt, который содержит данные структур STUDENT_MARK.

b-) Функция для вычисления среднего значения экзамена каждого студента помечает и записывает результат на экран как

«Среднесрочная оценка ученика ИМЯ ФАМИЛИЯ - СРЕДНЯЯ, окончательная оценка - ФИНАЛЬНАЯ, а его / ее среднее значение - СРЕДНЕЕ» *

void girme (int studentnum){
int i;
studentnum = 2;
STUDENT_MARK *ogrenci;

ogrenci = (STUDENT_MARK*) malloc(studentnum * sizeof(STUDENT_MARK));
if(ogrenci == NULL) { exit(1); }

for(i=0;i<studentnum;i++)
{

printf("Enter the student's name, surname, midterm and final respectively: \n");
scanf("%s %s %d %d",(ogrenci+i)->name, (ogrenci+i)->surname, &(ogrenci+i)->midterm, &(ogrenci+i)->final);

if((ogrenci+i)->midterm > 100 || (ogrenci+i)->midterm < 0 || (ogrenci+i)->final > 100 || (ogrenci+i)->final < 0)
    {
        printf("midterm or final can not be higher than 100 or lower than 0 \n");
        exit(1);
    }
}

}

void yazma (int studentnum){

int i;
STUDENT_MARK *ogrenci;
FILE *dosya;
dosya = fopen("marks_190704033.txt","w");
if{ (dosya == NULL)
    {
    printf("Could not open file");
    exit(1); 
    }
else
{

    for(i=0;i<studentnum;i++)
        {
            fprintf(dosya, "%s %s %d %d", (ogrenci+0)->name, (ogrenci+0)- 
>surname, (ogrenci+0)->midterm, (ogrenci+0)->final);
    }


}
fclose(dosya);
}


int main()
{

int n =2;
girme(n);
yazma(n);


return 0;
}

1 Ответ

2 голосов
/ 17 апреля 2020
STUDENT_MARK *ogrenci;
ogrenci = (STUDENT_MARK*) malloc(studentnum * sizeof(STUDENT_MARK));

ogrenci - это одиночный указатель на структуру STUDENT_MARK на пространство, выделенное для нескольких объектов struct STUDENT_MARK.

При использовании, например:

(ogrenci+i)->name

в for l oop вы пытаетесь получить доступ к несуществующим указателям структуры на несуществующие объекты структуры.

Примечание. Компилятор не связывает выделенное пространство с несколькими указателями!


Если вы хотите использовать арифметику указателей, например (ogrenci + i), вам нужно либо определить ogrenci как массив указателей на STUDENT_MARK:

int studentnum = 5;
STUDENT_MARK *ogrenci[studentnum];            

и инициализируйте каждый указатель по адресу существующего объекта структуры, для которого каждому было выделено отдельное пространство, например:

int studentnum = 5;
STUDENT_MARK *ogrenci[studentnum];

for(int i = 0; i < studentnum; i++)
{
    ogrenci[i] = malloc(sizeof(*ogrenci));
}

или вы определяете ogrenci как указатель на указатель на STUDENT_MARK:

int studentnum = 5;
STUDENT_MARK **ogrenci;

ogrenci = malloc(sizeof(*ogrenci) * studentnum);
*ogrenci = malloc(sizeof(**ogrenci) * studentnum);

"При такой записи (ogrenci+0) он работает правильно."

Однако он "работает" с 0, поскольку ogrenci + 0 = ogrenci , Нет никакой разницы с ogrenci.


Примечание: Как вы, наверное, уже заметили, я опустил приведение возвращенного указателя из malloc. Это потому, что в этом нет необходимости, и это может «добавить беспорядок» в ваш код: Должен ли я привести результат mallo c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...