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

Odczytywanie pliku tekstowego.

Object Storage Arubacloud
0 głosów
652 wizyt
pytanie zadane 16 lutego 2016 w C i C++ przez Uczen Użytkownik (600 p.)
#include <iostream>
#include <fstream>
#include <conio.h>
#include <cstdlib>


using namespace std;


string imie[10], nazwisko[10];
string nr_telefonu[10];
int main()
{

    fstream plik;
    plik.open("dane.txt",ios::in);

    if(plik.good()==false)
    {
        cerr<<"Brak pliku dane.txt.";
        exit(0);
    }





    string linia;
    int nr_linii=1, nr_imienia=0, nr_nazwiska=0, nr_nr_telefonu=0;
    while(getline(plik, linia));
    {


        switch(nr_linii)
        {
       case 1:
           {
             imie[nr_imienia]=linia;
             nr_imienia++;


           }
           break;

            case 2:
                {
                   nazwisko[nr_nazwiska]=linia;
                    nr_nazwiska++;
                }
                break;

                case 3:
                    {


                       nr_telefonu[nr_nr_telefonu]=atoi(linia.c_str())
                       nr_nr_telefonu++;

                    }
                    break;


        }

        if(nr_linii==3) nr_linii=0;


        nr_linii++;
    }



    for(int i=0;i<=nr_nr_telefonu;i++)
    {
        cout<<imie[i]<<endl;
        cout<<nazwisko[i]<<endl;
        cout<<nr_telefonu[i]<<endl;
    
    }

  

    plik.close();






    return 0;
}

 

Mam 2 pytania

Dlaczego ten kod nie działa?

Jak zamienic zmienną linia spowrotem na string?

1 odpowiedź

+4 głosów
odpowiedź 16 lutego 2016 przez draghan VIP (106,230 p.)
wybrane 16 lutego 2016 przez Uczen
 
Najlepsza

Witaj.

Nie uraź się tonem mojej odpowiedzi, bo chciałbym Ci pomóc, ale... Nie mogę. :)

 

Mam 2 pytania

Dlaczego ten kod nie działa?

Ja również mam pytanie: dlaczego uważasz, że ten kod nie działa? Zauważ, że nie znam Twojej intencji i nie mam absolutnie nawet bladego pojęcia, co byś chciał uzyskać - mogę jedynie wnioskować z dostarczonego kodu, ale sam twierdzisz, że nie jest on tym, o co Ci chodziło. ;)

Zmienna linia już jest typu std::string i już takiego typu zostanie. Musisz sprecyzować, co chcesz osiągnąć.

komentarz 16 lutego 2016 przez Uczen Użytkownik (600 p.)

Wybacz, była 2 w nocy i zapomniałem napisać co ten kod ma robić laugh, otóż ma on odczytywac kolejne linie pliku tekstowego i zapisywać je odpowiednich tabelach. Na koniec ma wszystko wypisać.

A co do drugiego pytania

 nr_telefonu[nr_nr_telefonu]=atoi(linia.c_str())

Użyłem w tej linijce kodu funkcji atoi, której działania nie jestem w 100% pewny. Wydaje mi się zmieniła ona zmienną linia z typu string na zmienną typu int. Czy może, po prostu przekonwertowała ją na potrzeby tej operacji?

Dziękuje za odpowiedź smiley

komentarz 16 lutego 2016 przez draghan VIP (106,230 p.)

Taak, wiem która była. ^^ Dlatego nawet nie zwróciłem uwagi na pewne oczywiste szczegóły.

First of - Twój kod się nie kompiluje, bo brakuje Ci średnika w 56. linii.

Second of - Twój kod nie wczytuje poprawnie danych, ponieważ masz średnik po warunku pętli while - to oznacza, że ta pętla jest 'pusta', a instrukcje które masz w bloku klamrowym niżej, wykonają się dokładnie jeden raz, niezależnie od tego warunku. Usuń średnik, a plik będzie wczytywany poprawnie.

Third of - masz błąd w przepisywaniu numeru telefonu.

Jeżeli chcesz mieć numer telefonu jako napis, to powinieneś mieć coś takiego:

std::string nr_telefonu[10];
std::string linia;
int nr_nr_telefonu;
// ...
nr_telefonu[nr_nr_telefonu] = linia;

Jeśli zaś chcesz mieć numery telefonów jako liczby, musisz mieć po pierwsze tablicę liczb, a nie napisów, a po drugie musisz odczytany napis przekonwertować na liczbę:

int nr_telefonu[10];
int nr_nr_telefonu;
std::string linia;
// ...
nr_telefonu[nr_nr_telefonu] = atoi(linia.c_str()); // konwersja "w stylu C"
// lub:
nr_telefonu[nr_nr_telefonu] = std::stoi(linia); // wymagany C++11

Przy konwersji nic złego ze zmienną linia się nie dzieje - nie jest ona modyfikowana w żaden sposób - tutaj ważna jest wartość zwracana przy konwersji, która nie jest łańcuchem.

Ponadto dwie uwagi:

1. Nie pilnujesz zakresu tablic - sprawdź co się stanie, jeśli w pliku dane.txt będzie więcej osób, niż 10. Jak możesz temu zaradzić?

2. Proszę, nie używaj zmiennych globalnych. Taki dobry nawyk.

I jeszcze takie uwagi techniczne:

Nie stosuj niepotrzebnie funkcji exit() - ona dość brutalnie przerywa program, nie pozwalając na uruchomienie się destruktorów przy wyjściu z zakresu - teraz to może Ci nie przeszkadzać, ale później na pewno da o sobie znać. Wyjście z funkcji main() można elegancko zrealizować prostym returnem, jak w każdej innej funkcji. ;)

I nie dołączaj do programu niepotrzebnych nagłówków, a już w szczególności staraj się unikać takich, które nie należą do standardu, jak conio.h, przynajmniej dopóki nie będziesz zmuszony z takich nagłówków korzystać. Zwiększy to przenośność Twoich programów, a to jest kolejny nawyk z tych "dobrych".

komentarz 16 lutego 2016 przez Uczen Użytkownik (600 p.)
edycja 16 lutego 2016 przez Uczen

Czyli męczyłem sie z tym 1,5h, przez średnik po while, cała reszta błędów powstała w wyniku usilnych prób dowiedzenia się co jest nie tak z kodem <facepalm>. Dziękuje za obszerną odpowiedź i wszystkie cenne rady smiley.

Co do pierwszej uwagi, wprowadziłem ifa i nie wywala programu, ale czy jest jakaś możliwość żeby zakres tablicy zmieniał się dynamicznie w zależności od wielkości pliku?-EDIT: Ok, dałem rade, dzięki za pomoc, pozdrawiam :D

 

 

komentarz 16 lutego 2016 przez draghan VIP (106,230 p.)

Jest taka możliwość, choć dość... ograniczona - jeśli brać pod uwagę jedynie możliwości rdzenia języka.

Odrobinę więcej szczegółów znajdziesz w tym wątku.

Podobne pytania

0 głosów
0 odpowiedzi 687 wizyt
pytanie zadane 15 kwietnia 2017 w Java przez plkpiotr Stary wyjadacz (12,420 p.)
0 głosów
2 odpowiedzi 438 wizyt
0 głosów
3 odpowiedzi 159 wizyt
pytanie zadane 11 maja 2016 w C i C++ przez Evelek Nałogowiec (28,960 p.)

92,568 zapytań

141,420 odpowiedzi

319,620 komentarzy

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

...