gpt4 book ai didi

c - 将表写入文件(二进制文件)后无法显示

转载 作者:行者123 更新时间:2023-11-30 16:20:59 25 4
gpt4 key购买 nike

#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);
}

所以基本上,该程序即将从文件中读取标记并将其放入表格中,然后对其进行处理,请记住它是(二进制文件),看起来我在编辑文件中的记录时遇到了问题,但没有'不知道怎么做,希望你们能弄清楚。

最佳答案

不仅仅是关于 sizeof(&E) 的评论:

在行

   T[i] = E.note;

你可以用 T 写出,因为你从不检查i < 30。为了更好地给出 T (30) 的大小,而不是给出 fichedeNoteE 在参数中未初始化。

在行

 if (T[j]>T[j + 1]) {

ji-1时,或者可能在T之外时,您访问未初始化的条目T[j + 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,可能的目标是添加其他字段,例如名称等

附注对于非法国人,我很抱歉,我用法语添加了消息;-)

关于c - 将表写入文件(二进制文件)后无法显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55050530/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com