я не могу отобразить после записи таблицы в файл (двоичный файл) - PullRequest
0 голосов
/ 07 марта 2019
#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);
}

Таким образом, в основном программа собирается прочитать метки из файла и поместить их в таблицу, а затем забыть об этом, имейте в виду, что это (двоичный файл), похоже, у меня возникла проблема с редактированием записи в файле, но я не Я понял, как это сделать, надеюсь, вы, ребята, поймете это.

1 Ответ

0 голосов
/ 07 марта 2019

Больше, чем примечания, как и раньше, 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. извините за не французов, я добавил сообщения на французском; -)

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