Podzielenie programu na dwa pliki

0

Witam.

Mam program zapisujący zawartość struktury w pliku, potrzebuje, aby znajdował się on co najmniej w dwóch plikach, nie jednym, co musze zrobic?

#include <stdio.h>
#include <stdlib.h>
#define MAXTYT 40
#define MAXAUT 40
#define MAXKS 10
struct ksiazka {
    char tytul[MAXTYT];
    char autor[MAXAUT];
    float wartosc;
};
int main(int argc, char* argv[])
{
    struct ksiazka bibl[MAXKS];
    int licznik = 0;
    int index, licznikp;
    FILE* pksiazki;
    int rozmiar = sizeof(struct ksiazka);
    if ((pksiazki = fopen("ksiazki.dat", "a+b")) == NULL) {
        fputs("Nie moge otworzyc pliku ksiazki.dat\n", stderr);
        exit(1);
    }
    rewind(pksiazki);
    while (licznik < MAXKS && fread(&bibl[licznik], rozmiar, 1, pksiazki) == 1) {
        if (licznik == 0)
            puts("Biezaca zawartosc pliku ksiazki.dat:");
        printf("%s by %s: %.2f zl\n", bibl[licznik].tytul,
               bibl[licznik].autor, bibl[licznik].wartosc);
        licznik++;
    }
    licznikp = licznik;
    if (licznik == MAXKS) {
        fputs("Plik ksiazki.dat jest pelny.", stderr);
        exit(2);
    }
    puts("Podaj nowe tytuly ksiazek.");
    puts("Aby zakonczyc, wcisnij [enter] na poczatku wiersza.");
    while (licznik < MAXKS && gets(bibl[licznik].tytul) != NULL
           && bibl[licznik].tytul[0] != '\0') {
        puts("Teraz podaj autora. ");
        gets(bibl[licznik].autor);
        puts("Teraz podaj wartosc.");
        scanf("%f", &bibl[licznik++].wartosc);
        while (getchar() != '\n')
            continue;
        if (licznik < MAXKS)
            puts("Podaj nastepny tytul.");
    }
    puts("Oto lista Twoich ksiazek: ");
    for (index = 0; index < licznik; index++)
        printf("%s, autor: %s, cena: %.2f zl\n", bibl[index].tytul,
               bibl[index].autor, bibl[index].wartosc);
    fwrite(&bibl[licznikp], rozmiar, licznik - licznikp, pksiazki);
    fclose(pksiazki);

    system("PAUSE");
    return 0;
}
0

Wrzuć książkę do nagłówka

0

Strukture do nagłówka? Ale jak mam to zrobić?

0

Utwórz plik ksiazka.h i tam zapakuj swoją strukture.
Następnie dołącz plik książka.h do pliku main.cpp.

0

Wszedłem w opcje kompilatora-->katalogi-->pliki nagłowkowe i dodałem tam folder w którym sie znajduje plik ksiazka.h, wszystko działa, ale czy to jest poprawny/optymalny sposób na zrobienie tego?

0

nie, miałeś po prostu napisać

#include "ksiazka.h"

0

"No such file or directory"

0

ksiazka.h musi być w tym samym katalogu co main.cpp

0

Zdaje sobie z tego sprawe, zapisałem cały projekt w nowym folderze i mam caly czas ten błąd, oto dowód:

user image

0

Już sobie poradziłem, głupi błąd, a tyle czasu straconego. Teraz dodatkowo do mojego programu pisze funkcje, która będzie liczyć średnią wartość wszystkich podanych książek, wygląda to tak, ale nie działa, gdzie mam błąd?

#include <stdio.h>
#include <stdlib.h>
#define MAXKS 10
#include "ksiazka.h"

float srednia(struct ksiazka* sr);

int main(int argc, char* argv[])
{
    struct ksiazka bibl[MAXKS];
    srednia(bibl);
    int licznik = 0;
    int index, licznikp;
    FILE* pksiazki;
    int rozmiar = sizeof(struct ksiazka);
    if ((pksiazki = fopen("ksiazki.dat", "a+b")) == NULL) {
        fputs("Nie moge otworzyc pliku ksiazki.dat\n", stderr);
        exit(1);
    }
    rewind(pksiazki);
    while (licznik < MAXKS && fread(&bibl[licznik], rozmiar, 1, pksiazki) == 1) {
        if (licznik == 0)
            puts("Biezaca zawartosc pliku ksiazki.dat:");
        printf("%s by %s: %.2f zl\n", bibl[licznik].tytul,
               bibl[licznik].autor, bibl[licznik].wartosc);
        licznik++;
    }
    licznikp = licznik;
    if (licznik == MAXKS) {
        fputs("Plik ksiazki.dat jest pelny.", stderr);
        exit(2);
    }
    puts("Podaj nowe tytuly ksiazek.");
    puts("Aby zakonczyc, wcisnij [enter] na poczatku wiersza.");
    while (licznik < MAXKS && gets(bibl[licznik].tytul) != NULL
           && bibl[licznik].tytul[0] != '\0') {
        puts("Teraz podaj autora. ");
        gets(bibl[licznik].autor);
        puts("Teraz podaj wartosc.");
        scanf("%f", &bibl[licznik++].wartosc);
        while (getchar() != '\n')
            continue;
        if (licznik < MAXKS)
            puts("Podaj nastepny tytul.");
    }
    puts("Oto lista Twoich ksiazek: ");
    for (index = 0; index < licznik; index++)
        printf("%s, autor: %s, cena: %.2f zl\n", bibl[index].tytul,
               bibl[index].autor, bibl[index].wartosc);
    fwrite(&bibl[licznikp], rozmiar, licznik - licznikp, pksiazki);
    fclose(pksiazki);

    system("PAUSE");
    return 0;
}

float srednia(struct ksiazka* sr)
{
    int i;
    float suma;
    for (i = 0; i > MAXKS; i++, sr++) {
        suma = suma + sr->wartosc;
    }
    printf("Srednia wartosc: %f", suma);
}
0

Spójrz na warunek pętli for w funkcji srednia :]
Ona nie wykona sie ani razu.
Poza tym to nie jest jednyny błąd w niej.

 
float srednia(struct ksiazka* sr)
{
    int i;
    float suma = 0;
    for (i = 0; i < MAXKS; i++) {
        suma = suma + sr[i].wartosc;
        printf("Val:%f\n", sr[i].wartosc);
    }
    printf("Srednia wartosc: %f", suma);
}
0

Siedzę przy tym nonstop od wczoraj, chyba trzeba sobie przerwę zrobić, bo ten warunek w pętli był wręcz genialny :D Dzięki za pomoc, wróce do tego później i dam znać

0
Proxima napisał(a):

Spójrz na warunek pętli for w funkcji srednia :]
Ona nie wykona sie ani razu.
Poza tym to nie jest jednyny błąd w niej.

 
float srednia(struct ksiazka* sr)
{
    int i;
    float suma = 0;
    for (i = 0; i < MAXKS; i++) {
        suma = suma + sr[i].wartosc;
        printf("Val:%f\n", sr[i].wartosc);
    }
    printf("Srednia wartosc: %f", suma);
}

Coś dziwnego dzieje się z tą pętlą, działa 5,10 razy z rzędu, później wartość zmienia sie nagle przyjmując wartości typu -234234253465....
Albo od początku tak sie dzieje, włącze i wyłącze projekt to raz działa, a raz nie..

#include <stdio.h>
#include <stdlib.h>
#define MAXTYT 40
#define MAXAUT 40
#define MAXKS 10
#include "ksiazka.h"
 
int srednia(struct ksiazka* sr);

struct ksiazka {
    char tytul[MAXTYT];
    char autor[MAXAUT];
    float wartosc;
};
 
int main(int argc, char* argv[])
{
    struct ksiazka bibl[MAXKS];
    int licznik = 0;
    int index, licznikp;
    FILE* pksiazki;
    int rozmiar = sizeof(struct ksiazka);
    if ((pksiazki = fopen("ksiazki.dat", "a+b")) == NULL) {
        fputs("Nie moge otworzyc pliku ksiazki.dat\n", stderr);
        exit(1);
    }
    rewind(pksiazki);
    while (licznik < MAXKS && fread(&bibl[licznik], rozmiar, 1, pksiazki) == 1) {
        if (licznik == 0)
            puts("Biezaca zawartosc pliku ksiazki.dat:");
        printf("%s by %s: %.2f zl\n", bibl[licznik].tytul,
               bibl[licznik].autor, bibl[licznik].wartosc);
        licznik++;
    }
    licznikp = licznik;
    if (licznik == MAXKS) {
        fputs("Plik ksiazki.dat jest pelny.", stderr);
        exit(2);
    }
    puts("Podaj nowe tytuly ksiazek.");
    puts("Aby zakonczyc, wcisnij [enter] na poczatku wiersza.");
    while (licznik < MAXKS && gets(bibl[licznik].tytul) != NULL
           && bibl[licznik].tytul[0] != '\0') {
        puts("Teraz podaj autora. ");
        gets(bibl[licznik].autor);
        puts("Teraz podaj wartosc.");
        scanf("%f", &bibl[licznik++].wartosc);
        while (getchar() != '\n')
            continue;
        if (licznik < MAXKS)
            puts("Podaj nastepny tytul.");
    }
    puts("Oto lista Twoich ksiazek: ");
    for (index = 0; index < licznik; index++)
        printf("%s, autor: %s, cena: %.2f zl\n", bibl[index].tytul,
               bibl[index].autor, bibl[index].wartosc);
    fwrite(&bibl[licznikp], rozmiar, licznik - licznikp, pksiazki);
    fclose(pksiazki);
        srednia(bibl); 
    system("PAUSE");
    return 0;
}

int srednia(struct ksiazka* sr)
{
    int i;
    int suma = 0;
    for (i = 0; i < MAXKS; i++) {
        suma = suma + sr[i].wartosc;
    }
    printf("Srednia wartosc: %d", suma);
}

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