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

Problem z plikami w C obiektowym

VPS Starter Arubacloud
+3 głosów
264 wizyt
pytanie zadane 12 kwietnia 2015 w C i C++ przez Rayden Użytkownik (610 p.)
edycja 13 kwietnia 2015 przez Rayden

Witam,

Chciałbym zrobić odczyt z pliku, w którym w pierwszej linii jest id (później zrobię tak, aby samo się inkrementowało), później imię, nazwisko i na końcu wiek. Gdy próbuje je wyświetlić to coś idzie nie tak i mogę to zrobić jedynie z id i wiekiem, a imie i nazwisko sie sypie. Próbowałem wielu sposobów, ale naprawdę już nie wiem co może byc nie tak. Jeżeli ktoś może pomóc byłbym bardzo wdzięczny :)

 

Poniżej jest kod, który znajduje się w pliku person.h

#include<iostream>
using namespace std;

class Person{
    
public:    
    int id[2], age[2];
    string name[2], surname[2];
    
    void add(); // adds person
    void load(); // loads content from file
};

A teraz person.cpp

void Person::load()
{
    fstream file;
    file.open("person.txt", ios::in);
    
    if(file.good()==false)
    {
        cout << "Cannot load the file";
        exit(0);
    }
    
    string line;
    int nr_line=1;
    int number=0;
    while (getline(file,line))
    {
        switch(nr_line)
        {
            case 1:
            {
                cout << "Test1";
                id[number]=atoi(line.c_str());
                break;
            }/*          TUTAJ POCZATEK KOMENTARZA BO BEZ NIEGO PROGRAM SIE SYPIE
            case 2:
            {
                cout << "Test2";
                name[number]=line;
                break;
            }
            case 3:
            {
                cout << "Test3";
                surname[number]=line;
                break;
            }*/             KONIEC KOMENTARZA
            case 4:
            {
                cout << "Test4";
                age[number]=atoi(line.c_str());
                break;
            }
        }
        if (nr_line==4)
        {
            cout << "Test5";
            nr_line=0;
            number++;
        }
        nr_line++;
    }
    
    file.close();
    
        for(int i=0; i<2; i++)
    {
        cout << id[i] << endl;
        cout << "cokolwiek1" << endl;   TUTAJ POWINNO BYC NAME[I]
        cout << "cokolwiek2" << endl;  A TUTAJ SURNAME[I]
        cout << age[i] << endl;
    }
}

3 odpowiedzi

0 głosów
odpowiedź 12 kwietnia 2015 przez Rayden Użytkownik (610 p.)
edycja 12 kwietnia 2015 przez Rayden

Faktycznie działa. Problem był w tym, iż nie wywoływałem konstruktora i nic nie "siedziało" w tym obiekcie.

int main()
{ Person p = Person();
  p.load(); }

Dzięki ^^, teraz z kolei stworzyłęm zmienną statyczną o nazwie rozmiar i inkrementuje ją jeżeli dodam jakąs osobę, ale gdy próbuje wczytać te 2 osoby wcześniejsze i tą trzecią dodaną to wystepuję błąd ..

#include<iostream>
using namespace std;

class Person{
	
	static int rozmiar;
public:	
	int id[5], age[5];
	string name[5], surname[5];
	
	void add(); // adds person
	void load(); // loads content from file
};

Tutaj nic nowego, ale jest deklaracja zmiennej statycznej prywatnej.

#include<iostream>
#include"person.h"
#include<fstream> // for reading from the file
#include<cstdlib> // for exit function
using namespace std;

int Person::rozmiar=2;

void Person::add()
{
	fstream file;
	rozmiar++;
	cout << "ID: ";
	cin >> id[rozmiar];
	cout << "Name: ";
	cin >> name[rozmiar];
	cout << "Surname: ";
	cin >> surname[rozmiar];
	cout << "Age: ";
	cin >> age[rozmiar];
	
	file.open("person.txt", ios::out | ios::app);
	
	file << id[rozmiar] << endl;
	file << name[rozmiar] << endl;
	file << surname[rozmiar] << endl;
	file << age[rozmiar] << endl;
	
	file.close();
}

void Person::load()
{
	fstream file;
	cout << "Rozmiar: " << rozmiar << endl;
	file.open("person.txt", ios::in);
	
	if(file.good()==false)
	{
		cout << "Cannot load the file";
		exit(0);
	}
	
	string line;
	int nr_line=1;
	int number=0;
	while (getline(file,line))
	{
		switch(nr_line)
		{
			case 1: 
			{
				id[number]=atoi(line.c_str());
				break;
			}
			case 2:
			{
				name[number]=line;
				break;
			}
			case 3:
			{
				surname[number]=line;
				break;
			}
			case 4: 
			{
				age[number]=atoi(line.c_str());
				break;
			}
		}
		if (nr_line==4)
		{
			nr_line=1;
			number++;
		}
		else
		{
		nr_line++;
		}
	}
	
	file.close();
	
		for(int i=0; i<rozmiar; i++)
	{
		cout << endl << "Person number: " << i+1 << endl;
		cout << id[i] << endl;
		cout << name[i] << endl;
		cout << surname[i] << endl;
		cout << age[i] << endl;
	}
}

Wiem, że kod jest trochę długi, ale wolałem wrzucić wszystko. Dodałem do tego co już było : zmienna statyczna rozmiar startuje od 2 (mam już 2 osoby w pliku txt) i zostaje inkrementowana na początku metody add(); Potem gdy odpalam metodę load(), ale tym razem dla 3 osób, bo jedną dodałem, to program się sypie. A gdy otwieram ten plik notatnika txt to ta osoba się tam znajduje. Byłbym wdzięczny za pomoc

0 głosów
odpowiedź 12 kwietnia 2015 przez Grabarz Bywalec (2,880 p.)

Przepisałem cały twój kod i sprawdziłem u siebie. U mnie wszystko działa. Nie wiem gdzie masz błąd. Dodałem else po ostatnim bloku if, gdyż nr_line był inkrementowany do dwóch przez co odrazu przeskakiwał do case 2.

#include <iostream>
#include <fstream>
#include <cstdlib>

class Person
{ public:    
   int id[2], age[2];
   std::string name[2], surname[2];
                   
   void add();
   void load(); };
 
void Person::load()
{ std::ifstream file;
  file.open("person.txt");
                
  if (!file.good())
  { std::cout << "Cannot load the file\n";
    exit(0); }
                    
  std::string line;
  int nr_line = 1;
  int number = 0;

  while (std::getline(file, line))
  { switch(nr_line)
    { case 1:
       id[number] = atoi(line.c_str());
       break;
      case 2:
       name[number] = line;
       break;
      case 3:
       surname[number] = line;
       break;
      case 4:
       age[number] = atoi(line.c_str());
       break; }
    if (nr_line == 4)
    { nr_line = 1;
      number++; }
    else nr_line++; }
    file.close();                                       
 for(int i=0; i < 2; i++)
 { std::cout << id[i] << std::endl;
   std::cout << name[i] << std::endl;
   std::cout << surname[i] << std::endl;
   std::cout << age[i] << std::endl; } }

int main()
{ Person p = Person();
  p.load(); }

person.txt:

15
Anna
Panna
49
78
Michal
Brzeszczot
44

0 głosów
odpowiedź 13 kwietnia 2015 przez Rayden Użytkownik (610 p.)
Właściwie robienie tutaj funkcji statyzcznej mija się z celem, bo odpalenie każdorazowo programu ustawia rozmiar na 2 ( bo tak ustawiłem). Myślę, że lepiej tutaj zrobić kolejny plik np. "informacje", w którym w pierwszej lini stworze liczbe 2(rozmiar) i będę ją zwiększał o 1 jesli dopisze jakąś nową osobę. Tak samo przy odczycie, będę korzystał z tego pliku i wczytywał to co siedzi w pierwszej linii, czyli aktualny rozmiar. Co o tym myślicie?

Podobne pytania

+1 głos
2 odpowiedzi 1,115 wizyt
pytanie zadane 25 kwietnia 2015 w C i C++ przez Rayden Użytkownik (610 p.)
+3 głosów
1 odpowiedź 21,960 wizyt
pytanie zadane 5 lipca 2015 w C i C++ przez Porky Obywatel (1,190 p.)
0 głosów
0 odpowiedzi 200 wizyt
pytanie zadane 15 września 2016 w C i C++ przez Aevin Początkujący (280 p.)

92,980 zapytań

141,943 odpowiedzi

321,189 komentarzy

62,309 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...