problem z zapisem do pliku

0

Witam. Ostatnio próbuję zapisać kilka danych do pliku. Niestety w dokumencie pojawiają się jedynie chińskie znaczki. Nie wiem w czym może być problem dlatego będę wdzięczny za każdą wskazówkę. Dziękuję.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main()
{
    char komenda[100];
    char** historia = (char**)malloc(7 * sizeof(char*));
    int i;
    for (i = 0; i < 7; i++) {
        historia[i] = (char*)malloc(100 * sizeof(char));
    }
    int licznik1 = 0;
    FILE* plik;
    plik = fopen("historia.txt", "w");
    if (!plik)
        printf("BLAD");

    while (licznik1 < 7) {
        gets(komenda);
        strcpy(historia[licznik1], komenda);
        printf("%s", historia[licznik1]);
        licznik1++;
        fprintf(plik, "%s\n", historia[licznik1]);
    }
    fclose(plik);
}
3
        printf("%s", historia[licznik1]);
        licznik1++;
        fprintf(plik, "%s\n", historia[licznik1]);

Zapisujesz do pliku "następny" element tablicy, ten do którego jeszcze nic nie przypisałeś. Odczyt takich danych to UB, tutaj objawiający się odczytem danych wyglądających losowo.

0

Zgadza się! Dziękuję i po rączkach całuję :) jeszcze mam takie pytanie bo w programie będzie pętla nieskończona i z programu wychodzę tylko przy użyciu ctr+x. Masz może jakiś pomysł żeby w tej sytuacji dane zapisały się do pliku?

2

fflush albo atexit. Proponuję to pierwsze.

0

Dzięki wielkie :) wszystko działa

1

Nie, przecież chcesz zapisać plik, a nie stdout.

fflush(plik); po fprintf w pętli.

0

Sory że jeszcze zajmuję czas ale mam pytanie czy można przy każdym obiegu pętli kasować zawartość pliku. Chodzi o to że muszę tam zapisać 20 ostatnich wejść z klawiatury. Czytałem o ciągłym otwieraniu tzn fopen() ale to chyba nie jest dobre rozwiązanie ponieważ potem przy otwarciu pliku wyskakują mi błędy.

0

W takiej sytuacji chyba wygodniej będzie nadpisywać cały plik za każdym razem.

0

To znaczy przy każdym obiegu pętli otwierać i zamykać plik?

1 użytkowników online, w tym zalogowanych: 0, gości: 1