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

Problem z programem odczytującym info z pliku tekstowego. Dlaczego nie działa?

Object Storage Arubacloud
0 głosów
522 wizyt
pytanie zadane 26 kwietnia 2018 w C i C++ przez KotDrewniany Początkujący (250 p.)
#include<stdio.h>
#include<stdlib.h>

struct Autka
{
    char nazwa[10];
    char dostep;
    int cena;
};

int cena(struct Autka *tablica, char *nazwa, int n);
void wyswietl_cene(struct Autka *tablica, char *nazwa, int n);



int main()
{
    typedef struct Autka Autka;

    Autka tab[10]; int i;
    FILE *plik; plik = fopen("C:\samochody.txt","r");

    for(;;) // bo max 10 samochodow, nie 10
    {
        fscanf(plik,"%s %s %d", tab[i].nazwa, tab[i].dostep, tab[i].cena);
        i++; if(feof(plik)!=0) break;
    }
    fclose(plik);

    char nazwa_autka[10]; int ilosc_dni;
    printf("Podaj nazwe autka: "); scanf("%s",&nazwa_autka);
    printf("Podaj ilosc dni: "); scanf("%d", &ilosc_dni);
    wyswietl_cene(tab,nazwa_autka,ilosc_dni);

    return 0;
}

int cena(struct Autka *tablica, char *nazwa, int n)
{
    int i; for(i=0; i<10; i++)
    {
        if(strcmp(tablica[i].nazwa,nazwa)==0)
        {
            if(tablica[i].dostep=='N')
            {
                return -2;

            }
            else
            {
                return n*tablica[i].cena;
            }
        }
    }
    return -1;
}

void wyswietl_cene(struct Autka *tablica, char *nazwa, int n)
{
	int w = cena(tablica,nazwa,n);

	if(w==-1)
    {
        printf("Brak nazwy \n");
    }
    else if(w==-2)
    {
        printf("Samochod niedostepny \n");
    }
	else
    {
        printf("Koszt %d ",w);
    }
}

Plik txtowy: 

Fiat T 120 
Ferrari T 60 
Ford N 100 
BMW N 100 
Bentley T 100 
Skoda T 50 
Audi T 70 
Nissan T 80 
Opel N 100 
Chevrolet T 110 

Program ma prosić użytkownika o podanie nazwy samochodu i ilości dni, a następnie wyświetla kwotę, jaką ma zapłacić wynajmujący. Jeżeli nie ma takiego samochodu albo jest on niedostępny, to wyświetla odpowiedni komunikat. 

komentarz 27 kwietnia 2018 przez Wiciorny Ekspert (270,190 p.)
debuger odpalasz i bedziesz wiedzial...

3 odpowiedzi

+1 głos
odpowiedź 26 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
"C:\samochody.txt"

W literale stringowym znak \ jest znakiem ucieczki (tak to się chyba tłumaczy), więc jest on trochę inaczej interpretowany. Żeby uzyskać właściwy backslash w takim stringu, trzeba go podwoić, czyli powinno być "C:\\samochody.txt".

Zmienna i w mainie nie jest inicjalizowana. Brakuje też sprawdzenia czy plik się w ogóle otworzył. Lepiej też nie używać feof, przynajmniej jeśli nie jest się w pełni świadomym jak ta funkcja działa. Zamiast feof można wykorzystać wartość zwracaną przez fscanf.

fscanf(plik,"%s %s %d", tab[i].nazwa, tab[i].dostep, tab[i].cena);

Dwa ostatnie parametry powinny być poprzedzone znakiem &. Poza tym %s dla char (chodzi tu o tab[i].dostep) może się skończyć nagłym zamknięciem aplikacji.

–2 głosów
odpowiedź 27 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

Poprawiłem moduł odczytu danych z pliku, nie powinno być już problemów. Ale program wymaga jeszcze kilku zmian, musisz popracować.

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
using namespace std;

struct Autka
{
    char nazwa[10];
    char dostep[10];
    int cena[10];
};

int cena(struct Autka * tablica, char * nazwa, int n);
void wyswietl_cene(struct Autka * tablica, char * nazwa, int n);

int main()
{
    typedef struct Autka Autka;
    int i = 0;
    Autka tab[10];
    ifstream plik ("C:\samochody.txt");   //otwarcie pliku
    if (plik)  //=true
    {
        while (!plik.eof())
        {
          plik >> tab[i].nazwa >> tab[i].dostep >> tab[i].cena;
          i ++;
        }
    }
    else
    {
     cout << "\n ERROR: nie mozna otworzyc pliku do odczytu." << endl;
    }
    plik.close();

    char nazwa_autka[10]; int ilosc_dni;
    printf("Podaj nazwe autka: "); scanf("%s",&nazwa_autka);
    printf("Podaj ilosc dni: "); scanf("%d", &ilosc_dni);
    wyswietl_cene(tab,nazwa_autka,ilosc_dni);

    return 0;
}

int cena(struct Autka * tablica, char * nazwa, int n)
{
    int i; for(i=0; i<10; i++)
    {
        if(strcmp(tablica[i].nazwa,nazwa)==0)
        {
            if(tablica[i].dostep=='N')
            {
                return -2;

            }
            else
            {
                return n*tablica[i].cena;
            }
        }
    }
    return -1;
}

void wyswietl_cene(struct Autka *tablica, char *nazwa, int n)
{
    int w = cena(tablica,nazwa,n);

    if(w==-1)
    {
        printf("Brak nazwy \n");
    }
    else if(w==-2)
    {
        printf("Samochod niedostepny \n");
    }
    else
    {
        printf("Koszt %d ",w);
    }
}

 

komentarz 27 kwietnia 2018 przez Qwerty96 Stary wyjadacz (13,580 p.)
Co to jest fstream, iostream czy using namespace std? Pytanie dotyczy języka C
komentarz 27 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
W pytaniu i kategorii nie ma takiego zaznaczenia.
komentarz 27 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
Tak. Autor pytania otagował je C by dostać odpowiedź w C++.

Nawet jeśli chodzi o C++, dużo błędów.
komentarz 27 kwietnia 2018 przez Comandeer Guru (601,590 p.)
@Beginer atakowanie kogoś atakiem ad personam a następnie odwracanie kota ogonem jest po prostu żenujące… Więcej takie zachowanie nie będzie tolerowane i zostaną wyciągnięte konsekwencje.
komentarz 27 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Szanowny kolego,

Nie bierz wszystkiego tak na serio (nawet nie wyglądasz na takiego).

Forum powinno być żywe, ciekawe - dowodem jest Twoje zainteresowanie, dlatego (czasami) używam  nieco bardziej frywolnego stylu - dla urozmaicenia, odstresowania. (W większości zajmujemy się ciężkimi tematami).

Mokrowski na pewno się nie obraził. (Bez obaw - nie zrobimy sobie krzywdy).
1
komentarz 27 kwietnia 2018 przez Comandeer Guru (601,590 p.)
@Beginer, proszę, nie ośmieszaj się… Serio będziesz mi wmawiać, że obrażasz ludzi, żeby forum było "żywe i ciekawe"? W takim razie chyba jednak pomyliłeś fora.
komentarz 27 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)
Przeczytaj tekst, który schowałeś, czy wynika z niego, że autor poczuł się "obrażony"?
komentarz 27 kwietnia 2018 przez Comandeer Guru (601,590 p.)
@Beginer, tu nie ma o czym dyskutować. Świadomie i celowo obraziłeś współdyskutanta, co jest działaniem nie tylko nieetycznym, ale przede wszystkim zabronionym przez regulamin forum. Koniec tematu.
–2 głosów
odpowiedź 27 kwietnia 2018 przez Beginer Pasjonat (22,110 p.)

Poniżej działający program z kilkoma poprawkami:

/*************************** Auta - wynajem (baza danych) *****************************/
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
using namespace std;

struct Autka
{
    char nazwa[10];
    char dostep;
    int cena;
};

int cena(struct Autka * tablica, char * nazwa, int n);
void wyswietl_cene(struct Autka * tablica, char * nazwa, int n);

int main()
{
    typedef struct Autka Autka;
    int i = 0;
    Autka tab[10];  //deklaracja tablicy ze struktura danych
    ifstream plik ("C:\samochody.txt");   //otwarcie pliku
    if (plik)  //=true
    {
        while (!plik.eof())
        {
          plik >> tab[i].nazwa >> tab[i].dostep >> tab[i].cena;
          i ++;
        }
    }
    else
    {
     cout << "\n ERROR: nie mozna otworzyc pliku do odczytu." << endl;
    }
    plik.close();

    char nazwa_autka[10]; int ilosc_dni;
    printf("Podaj nazwe autka: "); scanf("%s",&nazwa_autka);
    printf("Podaj ilosc dni: "); scanf("%d", &ilosc_dni);
    wyswietl_cene(tab, nazwa_autka, ilosc_dni);

    return 0;
}

int cena(struct Autka * tablica, char * nazwa, int n)
{
    for(int i = 0; i < 10; i++)
    {
        if(tablica[i].nazwa != 0)
        {
            if(tablica[i].dostep == 'N')
            {
             return -2;
            }
            else
            {
             return n * tablica[i].cena;
            }
        }
    }
    return -1;
}

void wyswietl_cene(struct Autka * tablica, char * nazwa, int n)
{
    int w = cena(tablica, nazwa, n);

    if(w == -1)
    {
        printf("Brak nazwy \n");
    }

    else if(w == -2)
    {
        printf("Samochod niedostepny \n");
    }

    else
    {
        printf("Koszt %d ", w);
    }
}

 

1
komentarz 27 kwietnia 2018 przez mokrowski Mędrzec (155,460 p.)
Błędy.

Podobne pytania

0 głosów
1 odpowiedź 536 wizyt
0 głosów
3 odpowiedzi 765 wizyt
–1 głos
1 odpowiedź 439 wizyt

92,579 zapytań

141,429 odpowiedzi

319,655 komentarzy

61,962 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!

...