• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Programowanie, pliki, C

Object Storage Arubacloud
0 głosów
237 wizyt
pytanie zadane 27 marca 2020 w C i C++ przez toja123321 Nowicjusz (220 p.)

Witam, mam problem z kompilacja programu, pilku w CodeBloksie, wyskakuja mi błędy kompilacji i nie wiem co jest źle, liczę na wasz pomoc! :)



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

int zapisT1(char nazwa[20], FILE *fplik);  // prototyp funkcji zapisu
int odczytT1(char nazwa[20], FILE *fplik); // prototyp funkcji odczytu
 //===================================
 int main(int argc, char *argv[])
 { char nazwa1[]="kontaktyDoDiewczyn.txt"; // deklaracja nazwy zapisywanego pliku
 FILE *f;                     // deklaaracja wskaznika plikowego
 int wynik;
 wynik=zapisT1(nazwa1,f);                       // wywolanie funkcji zapisu do pliku
 if(wynik==0)printf("Operacja zapisu ok\n");    // weryfikacja czy zapis sie udal
 wynik=odczytT1(nazwa1,f);                      // wywolanie funkcji odczytu z pliku
 if(wynik==0)printf("Operacja odczytu ok\n");   // weryfikacja czy odczyt sie udal
 system("PAUSE");                               // weryfikacja funkcji "system"
 return EXIT_SUCCESS;
 }
 //===================================
 int zapisT1(char nazwa[20], FILE *fplik)   // definicja funkcji zapisu nazwisk, imion, wiek i numer dziewczyn
 {char nazwisko[25]; int u=0;
 if((fplik=fopen(nazwa, "a"))==NULL)        // weryfikacja otwarcia pliku w trybie dopisywania na koncu
 {printf("Blad otwarcia\n");
 system("PAUSE"); abort();

 char imie[25]; int i=0;
 if((fplik=fopen(nazwa, "a"))==NULL)
 printf("Blad otwarcia\n");
 system("PAUSE"); abort();

 int wiek[25]; int o=0;
 if((fplik=fopen(nazwa, "a"))==NULL)
 printf("Blad otwarcia\n");
 system("PAUSE"); abort();

 int numer[25]; int p=0;
 if((fplik=fopen(nazwa, "a"))==NULL)
 printf("Blad otwarcia\n");
 system("PAUSE"); abort();}

 printf("Podaj nazwiska, imiona, wiek i numer telefonow dziewczyn konczac enterem:\n");
 while (gets(nazwisko)!=NULL && nazwisko[0]!='\0')   //???
    {fprintf(fplik, "%s\n", nazwisko);u++;}
 while (gets(imie)!=NULL && imie[0]!='\0')  <====================== TU POKAZUJE BŁĄD 
    {fprintf(fplik, "%s\n", imie);i++;}
 while (gets(wiek)!=NULL && wiek[0]!='\0')
    {fprintf(fplik, "%s\n", wiek);o++;}
 while (gets(numer)!=NULL && numer[0]!='\0')
    {fprintf(fplik, "%s\n", numer);p++;}


 if(fclose(fplik)!=0){exit(2);} //???
 printf("Do pliku zapisano %d nazwisk %d imion %d lat %d numerow\n",u i o p);
 return 0;
 }
 //--------------------------

 int odczytT1(char nazwa[20], FILE *fplik) //???

 {char nazwisko[25]; int u=0;
 if((fplik=fopen(nazwa, "r"))==NULL) //???
 {char imie[25]; int i=0;
 if((fplik=fopen(nazwa, "r"))==NULL)
 {int wiek[25]; int o=0;
 if((fplik=fopen(nazwa, "r"))==NULL)
 {int numer[25]; int p=0;
 if((fplik=fopen(nazwa, "r"))==NULL)

 {printf("blad otwarcia\n");
 system("PAUSE"); abort();}

 printf("\nZawartosc pliku %s\n",nazwa);
 while(fscanf(fplik,"%s",nazwisko)==1) //???
 while(fscanf(fplik,"%s",imie)==1)
 while(fscanf(fplik,"%s",wiek)==1)
 while(fscanf(fplik,"%s",numer)==1)

 {puts(nazwisko);u++; //???
 puts(imie);i++;
 puts(wiek);o++;
 puts(numer);p++;
 }
 if(fclose(fplik)!=0){exit(2);} //???
 printf("\nZ pliku odczytano %d nazwisk %d imion %d lat %d numerow\n",u i o p);
 return 0;
 }

 

2 odpowiedzi

0 głosów
odpowiedź 27 marca 2020 przez tangarr Mędrzec (154,860 p.)

Formatowanie kodu to cholernie ważna sprawa.
Ten kod to sieczka.
Przeformatowałem go troszkę.
 

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

int zapisT1(char nazwa[20], FILE *fplik);  // prototyp funkcji zapisu
int odczytT1(char nazwa[20], FILE *fplik); // prototyp funkcji odczytu
//===================================
int main(int argc, char *argv[])
{
    char nazwa1[]="kontaktyDoDiewczyn.txt"; // deklaracja nazwy zapisywanego pliku
    FILE *f;                     // deklaaracja wskaznika plikowego
    int wynik;
    wynik=zapisT1(nazwa1,f);                       // wywolanie funkcji zapisu do pliku
    if(wynik==0)
        printf("Operacja zapisu ok\n");    // weryfikacja czy zapis sie udal
    wynik=odczytT1(nazwa1,f);                      // wywolanie funkcji odczytu z pliku
    if(wynik==0)
        printf("Operacja odczytu ok\n");   // weryfikacja czy odczyt sie udal
    system("PAUSE");                               // weryfikacja funkcji "system"
    return EXIT_SUCCESS;
}
//===================================
int zapisT1(char nazwa[20], FILE *fplik)   // definicja funkcji zapisu nazwisk, imion, wiek i numer dziewczyn
{
    char nazwisko[25]; int u=0;
    if((fplik=fopen(nazwa, "a"))==NULL)        // weryfikacja otwarcia pliku w trybie dopisywania na koncu
    {
        printf("Blad otwarcia\n");
        system("PAUSE"); abort();
        
        char imie[25]; int i=0;
        if((fplik=fopen(nazwa, "a"))==NULL)
            printf("Blad otwarcia\n");
        system("PAUSE"); abort();
        
        int wiek[25]; int o=0;
        if((fplik=fopen(nazwa, "a"))==NULL)
            printf("Blad otwarcia\n");
        system("PAUSE"); abort();
        
        int numer[25]; int p=0;
        if((fplik=fopen(nazwa, "a"))==NULL)
            printf("Blad otwarcia\n");
        system("PAUSE"); abort();
    }
    
    printf("Podaj nazwiska, imiona, wiek i numer telefonow dziewczyn konczac enterem:\n");
    while (gets(nazwisko)!=NULL && nazwisko[0]!='\0')   //???
    {
        fprintf(fplik, "%s\n", nazwisko);u++;
    }
    while (gets(imie)!=NULL && imie[0]!='\0')  //<====================== TU POKAZUJE BŁĄD 
    {
        fprintf(fplik, "%s\n", imie);i++;
    }
    while (gets(wiek)!=NULL && wiek[0]!='\0')
    {
        fprintf(fplik, "%s\n", wiek);o++;
    }
    while (gets(numer)!=NULL && numer[0]!='\0')
    {
        fprintf(fplik, "%s\n", numer);p++;
    }
    
    
    if(fclose(fplik)!=0){
        exit(2);
    } //???
    printf("Do pliku zapisano %d nazwisk %d imion %d lat %d numerow\n",u i o p);
    return 0;
}
//--------------------------

int odczytT1(char nazwa[20], FILE *fplik) //???

{
    char nazwisko[25]; int u=0;
    if((fplik=fopen(nazwa, "r"))==NULL) //???
    {
        char imie[25]; int i=0;
        if((fplik=fopen(nazwa, "r"))==NULL)
        {
            int wiek[25]; int o=0;
            if((fplik=fopen(nazwa, "r"))==NULL)
            {
                int numer[25]; int p=0;
                if((fplik=fopen(nazwa, "r"))==NULL)                    
                {
                    printf("blad otwarcia\n");
                    system("PAUSE"); abort();
                }
                
                printf("\nZawartosc pliku %s\n",nazwa);
                while(fscanf(fplik,"%s",nazwisko)==1) //???
                    while(fscanf(fplik,"%s",imie)==1)
                        while(fscanf(fplik,"%s",wiek)==1)
                            while(fscanf(fplik,"%s",numer)==1)
                                
                            {
                                puts(nazwisko);u++; //???
                                puts(imie);i++;
                                puts(wiek);o++;
                                puts(numer);p++;
                            }
                if(fclose(fplik)!=0){
                    exit(2);
                } //???
                printf("\nZ pliku odczytano %d nazwisk %d imion %d lat %d numerow\n",u i o p);
                return 0;
            }

Teraz kod jest czytelniejszy.
Popraw bloki kodu (nawiasy klamrowe) a kod się skompiluje.

komentarz 27 marca 2020 przez toja123321 Nowicjusz (220 p.)

Dzięki ale dalej jest błąd w tej samej linijce "51" wiesz o co może chodzić bo ja już nie mam pomysłów sad

komentarz 27 marca 2020 przez tangarr Mędrzec (154,860 p.)
Pokaż poprawiony kod
komentarz 27 marca 2020 przez tangarr Mędrzec (154,860 p.)
Zmienna imie jest dostępna tylko w liniach 30-44
komentarz 27 marca 2020 przez toja123321 Nowicjusz (220 p.)
Czy z { } jest coś nie tak?
komentarz 27 marca 2020 przez tangarr Mędrzec (154,860 p.)
Czy rozumiesz co dzieje się w tym kodzie? Czym są bloki kodu?
komentarz 28 marca 2020 przez toja123321 Nowicjusz (220 p.)
Nie za bardzo właśnie, ale musze to jakoś wykonać
komentarz 28 marca 2020 przez tangarr Mędrzec (154,860 p.)

To niedobrze. Zacznijmy od podstaw. Czym jest zasięg zmiennej? Jest to fragment kodu w którym zmienna istnieje i jest dostępna.

Mam nadzieję, że taki krótki przykład z komentarzami troszkę rozjaśni sytuację

#include <stdio.h>

// zmienne globalne są dostępne w każdym miejscu programu
// (od momentu zadeklarowania)
int zmiennaGlobalna = 1;

void funkcja1() {
    // zmiennaLokalna jest dostępna tylko w bloku kodu
    // w którym została zadeklarowana
    int zmiennaLokalna = 2;

    // to jest blok kodu
    // może zostać utworzony w dowolnym miejscu
    // najczęściej się je tworzy po instrukcjach: if, for, while
    {
        // zmiennaLokalna2 jest dostępna tylko w tym 
        // bloku kodu
        int zmiennaLokalna2 = 3;
    }
    
    // próba użycia zmiennej zmiennLokalna2
    // w tym miejscu zakończy się błędem kompilacji
}

int main() {
    funcja1();
    return 0;   
}

A teraz spójrzmy na kawałek twojego kodu
 

int zapisT1(char nazwa[20], FILE *fplik)  
{
    char nazwisko[25]; int u=0;
    if((fplik=fopen(nazwa, "a"))==NULL) // w razie błędu wchodzimy do poniższego bloku kodu
    {
        printf("Blad otwarcia\n");
        system("PAUSE"); abort(); // ten abort spowoduje przerwanie programu

        // czy jesteś pewien, że ten kod ma być w tym samym bloku?
        // ten kod nigdy nie zostanie wykonany
         
        char imie[25]; int i=0; // deklarcja zmiennych
        if((fplik=fopen(nazwa, "a"))==NULL)
            printf("Blad otwarcia\n");
        system("PAUSE"); abort(); // te instrukcje zostaną wykonane niezależnie od wyniku if
         
        int wiek[25]; int o=0;  // deklaracja zmiennych
        if((fplik=fopen(nazwa, "a"))==NULL)
            printf("Blad otwarcia\n");
        system("PAUSE"); abort();  // te instrukcje zostaną wykonane niezależnie od wyniku if
         
        int numer[25]; int p=0;  // deklaracja zmiennych
        if((fplik=fopen(nazwa, "a"))==NULL)
            printf("Blad otwarcia\n");
        system("PAUSE"); abort();  // te instrukcje zostaną wykonane niezależnie od wyniku if
    } // wszystkie zmienne zadeklarowane w tym bloku przestają istnieć
     
    printf("Podaj nazwiska, imiona, wiek i numer telefonow dziewczyn konczac enterem:\n");
    while (gets(nazwisko)!=NULL && nazwisko[0]!='\0')   //???
    {
        fprintf(fplik, "%s\n", nazwisko);u++;
    }
    while (gets(imie)!=NULL && imie[0]!='\0')  // ta zmienna nie istnieje w tym bloku kodu
    {
        fprintf(fplik, "%s\n", imie);i++;
    }

 

0 głosów
odpowiedź 27 marca 2020 przez p099 Mądrala (6,390 p.)
Ten kod jest całościowo rozwalony, wszędzie sypie błędy. Nie używaj gets() ponieważ źle buforuje ciągi, użyj fgets().
komentarz 27 marca 2020 przez p099 Mądrala (6,390 p.)

W dodatku jak kod będzie działać to masz błąd w nazwie pliku: "kontaktyDoDiewczyn.txt"

komentarz 27 marca 2020 przez toja123321 Nowicjusz (220 p.)
Czemu błąd?
komentarz 27 marca 2020 przez p099 Mądrala (6,390 p.)
Według moich myśli powinno być "Dziewczyn" ale mogę się mylić

Podobne pytania

0 głosów
2 odpowiedzi 313 wizyt
pytanie zadane 1 listopada 2015 w C i C++ przez GameFreak Początkujący (450 p.)
–2 głosów
2 odpowiedzi 645 wizyt
pytanie zadane 9 czerwca 2020 w Systemy operacyjne, programy przez Grzegorzko Obywatel (1,110 p.)
+1 głos
0 odpowiedzi 268 wizyt
pytanie zadane 9 marca 2021 w C i C++ przez ifuknowme555 Początkujący (410 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,958 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...