Больше, чем примечания, как и раньше, sizeof(&E)
:
В строке
T[i] = E.note;
вы можете написать из T, потому что вы никогда не проверяете i <30. Для этого лучше указать размер T (30), а не <em>fichedeNote и E не инициализировано в аргументе.
В строке
if (T[j]>T[j + 1]) {
Вы получаете доступ к неинициализированной записи T[j + 1]
, когда j равно i-1
или может быть вне T
Вы читаете / записываете в память представление Eleve в своем файле со связанной с этим маленькой / большой проблемой порядка байтов
Кажется логичным прочитать файл, чтобы поместить заметки в T до , чтобы получить новые заметки
Предложение:
#include <stdio.h>
#include <stdlib.h>
struct Eleve {
float note;
};
size_t lireNotes(float T[], size_t max, const char * fn)
{
FILE* fichedeNote = fopen(fn, "rb");
size_t sz = 0;
struct Eleve E;
if (fichedeNote == NULL)
return 0;
while ((sz != max) && fread(&E, sizeof(E), 1, fichedeNote))
T[sz++] = E.note;
fclose(fichedeNote);
/* debug */
puts("anciennes notes:");
for (size_t j = 0; j<sz; j++) {
printf("Note %d: %.2f\n", (j + 1), T[j]);
}
putchar('\n');
return sz;
}
void saisirNote(float T[], size_t max, size_t sz, const char * fn) {
char rep;
FILE* fichedeNote = fopen(fn, "wb");
if (fichedeNote == NULL) {
printf("impossible d'ouvrir %s en ecriture\n", fn);
return;
}
do {
struct Eleve E;
if (sz == max) {
puts("plus de place pour une nouvelle note");
break;
}
printf("\nSaisir Une Note %d: ", (sz + 1));
if (scanf("%f", &E.note) != 1)
puts("note invalide");
else {
T[sz++] = E.note;
puts("Saisie de note avec Succes !");
}
printf("Voulez-Vous Saisir Une autre Note ?: ");
if (scanf(" %c", &rep) != 1)
break;
} while (rep != 'N');
/* debug */
puts("\nliste des notes:");
for (size_t j = 0; j<sz; j++) {
printf("Note %d: %.2f\n", (j + 1), T[j]);
}
/* tri */
if (sz > 1) {
int en_desordre;
do {
en_desordre = 0;
for (size_t j = 0; j < (sz-1); j++) {
if (T[j]>T[j + 1]) {
float tmp = T[j + 1];
T[j + 1] = T[j];
T[j] = tmp;
en_desordre = 1;
}
}
} while (en_desordre == 1);
}
/* debug */
puts("\n***Note Trie***:");
for (size_t j = 0; j<sz; j++) {
printf("Note %d: %.2f\n", (j + 1), T[j]);
}
/* update file */
for (size_t j = 0; j<sz; j++) {
struct Eleve E;
E.note = T[j];
fwrite(&E, sizeof(E), 1, fichedeNote);
}
fclose(fichedeNote);
}
int main()
{
float T[30];
const char * fn = "/tmp/Fnote.dat";
size_t sz = lireNotes(T, sizeof(T)/sizeof(*T), fn);
saisirNote(T, sizeof(T)/sizeof(*T), sz, fn);
}
Компиляция и исполнение:
pi@raspberrypi:/tmp $ gcc -g -pedantic -Wextra e.c
pi@raspberrypi:/tmp $ rm -f Fnote.dat
pi@raspberrypi:/tmp $ ./a.out
Saisir Une Note 1: 11
Saisie de note avec Succes !
Voulez-Vous Saisir Une autre Note ?: o
Saisir Une Note 2: 22
Saisie de note avec Succes !
Voulez-Vous Saisir Une autre Note ?: o
Saisir Une Note 3: 15
Saisie de note avec Succes !
Voulez-Vous Saisir Une autre Note ?: N
liste des notes:
Note 1: 11.00
Note 2: 22.00
Note 3: 15.00
***Note Trie***:
Note 1: 11.00
Note 2: 15.00
Note 3: 22.00
pi@raspberrypi:/tmp $ ./a.out
anciennes notes:
Note 1: 11.00
Note 2: 15.00
Note 3: 22.00
Saisir Une Note 4: 0
Saisie de note avec Succes !
Voulez-Vous Saisir Une autre Note ?: O
Saisir Une Note 5: 44
Saisie de note avec Succes !
Voulez-Vous Saisir Une autre Note ?: N
liste des notes:
Note 1: 11.00
Note 2: 15.00
Note 3: 22.00
Note 4: 0.00
Note 5: 44.00
***Note Trie***:
Note 1: 0.00
Note 2: 11.00
Note 3: 15.00
Note 4: 22.00
Note 5: 44.00
pi@raspberrypi:/tmp $
Примечание. Я все еще использую структуру Eleve , возможно, цель состоит в том, чтобы добавить другие поля, такие как имя и т. Д.
P.S. извините за не французов, я добавил сообщения на французском; -)