#include <stdio.h>
#include <stdlib.h>
struct Eleve {
float note;
};
void saisirNote(struct Eleve E, FILE* fichedeNote, float T[30]) {
char rep;
fichedeNote = fopen("C:/Users/Ayoub/Desktop/TDTP/EX2/Notef/Fnote.dat", "wb");
int i = 0;
int en_desordre = 1;
float tmp = 0.0;
do {
printf("\nSaisir Un Note %d: ", (i + 1));
scanf("%f", &E.note);
T[i] = E.note;
i++;
fwrite(&E, sizeof(&E), 1, fichedeNote);
if (fwrite != 0)
printf("\n\nSaisie de note avec Succes ! \n\n");
printf("\n\nVoulez-Vous Saisir Un autre Note ?: ");
scanf(" %c", &rep);
} while (rep != 'N');
for (int j = 0; j<i; j++) {
printf("Note %d: %.2f\n", (j + 1), T[j]);
}
while (en_desordre == 1) {
en_desordre = 0;
for (int j = 0; j<i; j++) {
if (T[j]>T[j + 1]) {
tmp = T[j + 1];
T[j + 1] = T[j];
T[j] = tmp;
en_desordre = 1;
}
}
}
while (fread(&E, sizeof(&E), 1, fichedeNote)) {
for (int j = 0; j<i; j++) {
E.note = T[j];
fwrite(&E, sizeof(&E), 1, fichedeNote);
}
}
printf("\n\n***Note Trie***\n\n");
while (fread(&E, sizeof(&E), 1, fichedeNote)) {
printf("\nNote = %f\n\n", E.note);
}
}
int main()
{
float T[30];
FILE* fichedeNote;
struct Eleve E;
saisirNote(E, fichedeNote, T);
}
所以基本上,该程序将要从文件中读取标记并将其放在表中,然后将其弄伤,请记住它是(二进制文件),看来我在编辑文件中的记录时遇到问题,但是没有t想出了办法,希望你们弄清楚。
答案 0 :(得分:0)
关于sizeof(&E)
的评论已经不止这些了:
在线
T[i] = E.note;
您可以写出T,因为您无需检查 i <30。为此,最好给出T(30)的大小,而不要给出 fichedeNote 和 E 未在参数中初始化。
在线
if (T[j]>T[j + 1]) {
当 j 为T[j + 1]
或可能不属于T时,您将访问未初始化的条目i-1
您在文件中读取/写入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。对非法国人表示抱歉,我添加了法文;-)