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

时间:2019-03-07 18:27:37

标签: c

#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想出了办法,希望你们弄清楚。

1 个答案:

答案 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。对非法国人表示抱歉,我添加了法文;-)