x-kom hosting

[C++] Odczytywanie poszczególnych linii

Przejdź do rekomendowanej odpowiedzi Autor: Garrappachc ,
Kacperjas
utworzono
utworzono (edytowane)

Witam!
Program ma załączoną bibliotekę fstream.
Fragment kodu:


//POCZĄTEK WCZYTYWANIA
fstream plik("form.txt", ios::in);
getline(plik, Imie);
getline(plik, Nazwisko);
getline(plik, Wiek);
getline(plik, email);
getline(plik, telefon);
plik.close();
//KONIEC WCZYTYWANIA // WYPISYWANIE INFORMACJI
wys("Imie", Imie);
wys("Nazwisko", Nazwisko);
wys("Wiek", Wiek);
wys("Email", email);
wys("Telefon", telefon);

Funkcja wys wyświetla zmienne ale nie wyświetlają się.
Czy popełniłem jakiś błąd w odczytywaniu?

Wg mojego założenia program powinien odczytywać każdą linijkę po kolei, ale tak nie jest...
Mogę udostępnić większy fragment kodu.

EDIT: Dodaję Prt Sc [attachment=26372:Odczyt nie działa.jpg]

rafalluz
komentarz
komentarz

Pokaż funkcję wys().

Kacperjas
komentarz
komentarz (edytowane)

Oto ona

void wys(string opis, string wlasciwy)
{
//0 - czarny
//1 - niebieski
//2 - zielony
//3 - błękitny
//4 - czerwony
//5 - purpurowy
//6 - żółty
//7 - biały
//8 - szary
//9 - jasnoniebieski
//10 - jasnozielony
//11 - jasnobłękitny
//12 - jasnoczerwony
//13 - jasnopurpurowy
//14 - jasnożółty
//15 - jaskrawobiały
HANDLE hWyj;
hWyj = GetStdHandle(STD_OUTPUT_HANDLE); 
SetConsoleTextAttribute( hWyj, 14);
cout<<opis<<setw(30)<<"-->";
SetConsoleTextAttribute( hWyj, 13);
cout<<wlasciwy<<endl;
SetConsoleTextAttribute( hWyj, 15);
}
EDIT: Wszystkie dołączone biblioteki:
#include <windows.h>
#include <iostream>
#include <string>
#include <stdio.h>
#include <iomanip>
#include <fstream>
Garrappachc
komentarz
komentarz
fstream plik("form.txt", ios::in);
plik >> Imie >> Nazwisko >> Wiek >> email >> telefon;
plik.close();
Kacperjas
komentarz
komentarz (edytowane)

Nie działa  :beksa:  Ciągle to samo...


Zmodyfikowałem kod na taki:

fstream plik;
plik.open("form.txt", ios::in);
if(plik.good())
getline(plik, Imie);
else
cout<<"ERROR!"<<endl;

Program wyświetla napis error O.o

Garrappachc
komentarz
komentarz

Plik nie istnieje lub nie ma praw do odczytu. W metodzie fstream::open() podaj bezwzględną ścieżkę.

  • Dobra wypowiedź 1
Kacperjas
komentarz
komentarz (edytowane)

Hmm... Programuję na koncie Gościa :facepalm:  może dlatego pozbawia mnie praw...
Plik ma być gdzie jest main.cpp (tam mam kod)?

EDIT:

Na koncie admina też nie działa...

Gdzie postawić tą metodę?

EDIT2:
Przy fragmencie:

//POCZĄTEK WCZYTYWANIA
fstream plik;
plik.open("form.txt", ios::in);
fstream::open("C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\Konsolowy_2\\Konsolowy_2\\Form.txt");
if(plik.good())
getline(plik, Imie);
else
cout<<"ERROR!"<<endl;
//plik >> Imie >> Nazwisko >> Wiek >> email >> telefon;
/*getline(plik, Imie);
getline(plik, Nazwisko);
getline(plik, Wiek);
getline(plik, email);
getline(plik, telefon);*/
plik.close();
//KONIEC WCZYTYWANIA // WYPISYWANIE INFORMACJI
wys("Imie", Imie);
wys("Nazwisko", Nazwisko);
wys("Wiek", Wiek);
wys("Email", email);
wys("Telefon", telefon);
}

Jest błąd uniemożliwiający dalszą kompilacje:

[spoiler]1>------ Build started: Project: Konsolowy_2, Configuration: Debug Win32 ------
1> main.cpp
1>c:\users\admin\documents\visual studio 2010\projects\konsolowy_2\konsolowy_2\main.cpp(60): error C2352: 'std::basic_fstream<_Elem,_Traits>::open' : illegal call of non-static member function
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits
1> ]
1> c:\program files\microsoft visual studio 10.0\vc\include\fstream(1315) : see declaration of 'std::basic_fstream<_Elem,_Traits>::open'
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========[/spoiler]

leggo
komentarz
komentarz

Niepotrzebnie dwa razy wywołujesz open, za drugim razem nawet nie łącząc tego z żadną zmienną.

Zmień to w jedno wywołanie:

plik.open("C:\\Users\\Admin\\Documents\\Visual Studio 2010\\Projects\\Konsolowy_2\\Konsolowy_2\\Form.txt", ios::in);
  • Dobra wypowiedź 1
Garrappachc
komentarz
komentarz

Moje fstream::open() odnosiło się do nazwy metody, nie mówiłem że masz to w ten sposób wywołać...

Kacperjas
komentarz
komentarz

Znów przy tym nieszczęsnym programie na koncie gościa wyświetla ERROR!
Fragment kodu:

//POCZĄTEK WCZYTYWANIA
                fstream plik;
                plik.open("C:\\Users\\Gość\\Documents\\Visual Studio 2010\\Projects\\Konsolowy_2\\Konsolowy_2\\form.txt", ios::in);
                if(plik.good())
                getline(plik, Imie);
                else
                    cout<<"ERROR!"<<endl;
                //plik >> Imie >> Nazwisko >> Wiek >> email >> telefon;
                /*getline(plik, Imie);
                getline(plik, Nazwisko);
                getline(plik, Wiek);
                getline(plik, email);
                getline(plik, telefon);*/
                plik.close();
    //KONIEC WCZYTYWANIA // WYPISYWANIE INFORMACJI
                wys("Imie", Imie);
                wys("Nazwisko", Nazwisko);
                wys("Wiek", Wiek);
                wys("Email", email);
                wys("Telefon", telefon);
 
Garrappachc
komentarz
komentarz

Ścieżka wydaje się być niepoprawna. Katalog "Gość" prawdopodobnie nie istnieje (tylko Eksplorator Windows tak to sobie tłumaczy) i nazywa się "Guest" albo coś jeszcze innego (najlepiej sprawdzić zewnętrznym programem). Co więcej, kompilator może mieć problem z przepchnięciem "ść" przez c-stringa.

Kacperjas
komentarz
komentarz

Przeniosłem pliczek do dysku D oraz zmieniłem linijkę na

plik.open("D:\\form.txt", ios::in);

Wszystko na marne... Również wyświetla "ERROR"

Może to kwestia praw Gościa, albo środowisko programistyczne nie może się z czymś pogodzić?
Używam Microsoft Visual C++ 2010 Express

Jakie mogą być jeszcze inne czynniki? Mój system do Windows Vista :gobi:


EDIT: Na koncie administratora to samo (na ścieżce D:\\form.txt)

Garrappachc
komentarz
komentarz

Aha, i nie wiem jeszcze skąd pomysł, by używać podwójnych backslashy. Nie działa zwykłe

plik.open("D:/form.txt", ios::in);
Kacperjas
komentarz
komentarz (edytowane)

Ehh... Niestety ten ERROR! [attachment=26448:ERROR!.png]
EDIT: Na koncie Administratora

EDIT2: Plik jest na pewno [attachment=26449:plik.png]

Garrappachc
komentarz
komentarz

Przetestuj plik pod obecność flag goodbit, failbit, eofbit i badbit.

Kacperjas
komentarz
komentarz (edytowane)

Jestem trochę początkującym programistą :slabe:  Więc upewniam się:
Flagi to są metody, prawda?

np.:

if(plik.goodbit)
cout<<"plik.goodbit=1"<<endl;
else cout<<"plik.goodbit=0"<<endl

EDIT: Oto co wyszło po napisaniu paru linijek kodu [attachment=26450:all_methods.png]

Kacperjas
komentarz
komentarz

Mógłbyś pokazać na przykładzie?
Z cplusplus.com zrozumiałem że jest to metoda dołączona do biblioteki iostream pod przestrzenią nazw std (std::ios::eof) :E
Czyli moje rozumowanie że plik.eof() jest poprawne?

Garrappachc
komentarz
komentarz

Tak, metoda fstream::eof() zwraca wartość flagi eofbit dla danego obiektu. Akurat mnie bardziej interesuje flaga failbit.

Kacperjas
komentarz
komentarz

Tak więc zrobiłem do wszystkich flag:


if(wyb==2)

        {

    //POCZĄTEK WCZYTYWANIA

                fstream plik;

                plik.open("D:/form.txt", ios::in);

                if(plik.good())

                getline(plik, Imie);

                else

                    cout<<"plik.good=0"<<endl;

                if(plik.goodbit)

                    cout<<"plik.goodbit=1"<<endl;

                else

                    cout<<"plik.goodbit=0"<<endl;

                if(plik.failbit)

                    cout<<"plik.failbit=1"<<endl;

                else

                    cout<<"plik.failbit=0"<<endl;

                if(plik.eofbit)

                    cout<<"plik.eofbit=1"<<endl;

                else

                    cout<<"plik.eofbit=0"<<endl;

                if(plik.badbit)

                    cout<<"plik.badbit=1"<<endl;

                else

                    cout<<"plik.badbit=0"<<endl;

                



                //plik >> Imie >> Nazwisko >> Wiek >> email >> telefon;

                /*getline(plik, Imie);

                getline(plik, Nazwisko);

                getline(plik, Wiek);

                getline(plik, email);

                getline(plik, telefon);*/

                plik.close();

    //KONIEC WCZYTYWANIA // WYPISYWANIE INFORMACJI

                wys("Imie", Imie);

                wys("Nazwisko", Nazwisko);

                wys("Wiek", Wiek);

                wys("Email", email);

                wys("Telefon", telefon);

        }


I wyświetliło [attachment=26495:post-97421-0-97771800-13790168911.png]

  • Rekomendowana odpowiedź
Garrappachc
komentarz
komentarz

No przykro mi, coś jest nie tak z plikiem. Nie ma innej możliwości.

Kacperjas
komentarz
komentarz

Usunełem poprzedni plik oraz stworzyłem nowy i działa :gobi:
Dziękuje!
Uważam temat za zamknięty.

Wciąż szukasz rozwiązania problemu? Napisz teraz na forum!

Możesz zadać pytanie bez konieczności rejestracji - wystarczy, że wypełnisz formularz.

×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Strona wykorzystuje pliki cookies w celu prawidłowego świadczenia usług i wygody użytkowników. Warunki przechowywania i dostępu do plików cookies możesz zmienić w ustawieniach przeglądarki.