Usuwanie wybranego wiersza z pliku, problem z zasięgiem obiektu.

0

Witam,
W pliku *.txt znajduje się lista dostępnych towarów. Użytkownik wybiera z listy jeden towar po czym jest on usuwany z pliku. Całość zrobiłem przy użyciu dynamicznej tablicy obiektów.
Po otwarciu pliku zliczam linie, po czym tworzę tablicę dynamiczną. Próbowałem zrobić to w następujący sposób:

			const int UP = 72, DOWN = 80, LEFT = 75, RIGHT = 77;
			unsigned int count = 0, num_of_lines = 0;
			system("cls");
			string buffer;

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

			if (kartoteka.good()) {
					while (!kartoteka.eof()) {
						getline(kartoteka, buffer);
						++num_of_lines;
					}
				}
				
				kartoteka.seekg(0);
				

				Item *item = new Item[num_of_lines];
				string ItemName;
				unsigned int ItemQuantity;
				double ItemPrice;


				
				while (!kartoteka.eof()) {
					kartoteka >> ItemName >> ItemQuantity >> ItemPrice;
					item[count].SetItem(ItemName, ItemQuantity, ItemPrice);
					++count;
				}


				kartoteka.seekg(0);
				kartoteka.close();

				count = 0;
				char c;

				do {
					system("cls");

					for (unsigned int i = 0; i < num_of_lines; ++i) {
						if (i == count) { SetYellowColour(); cout << "\t" << (i + 1) << ". "; item[count].ShowItem(); SetWhiteColour(); continue; }
						else cout << "\t" << (i + 1) << ". "; item[i].ShowItem();
					}
					c = _getch();
					if (c == DOWN) { if (count < num_of_lines) ++count; }
					if (c == UP) { if (count > 0) --count; }
				} while (c != 27 && c != 13);

				

				system("cls");

				ofstream new_kartoteka;
				new_kartoteka.open("kartoteka.txt", ios::trunc);

				if (new_kartoteka.good()) {
					for (unsigned int i = 0; i < num_of_lines; ++i) {
						if (i != count) { new_kartoteka << item[i].ReturnName() << "\t\t" << item[i].ReturnQuantity() << "\t\t" << item[i].ReturnPrice() << endl; }
					}
				}
				else cout << "Brak lacznosci z serwerem!" << endl;

				new_kartoteka.close();

To ostatnia "wersja" tego co udało mi się wymyślić.. Wcześniej tablicę tworzyłem przed zamknięciem pliku, jednak później nie miałem do niej dostępu. Próbowałem także, w ogóle nie zamykać pliku, wtedy faktycznie usuwało wybraną linię, jednak ostatnia linia w pliku się powielała (i to w dziwny sposób, była jakaś poucinana).

Powyższy kod TEORETYCZNIE działa jak należy, mianowicie w pliku faktycznie wybrana linia znika, jednak całość jest w pętli i ponowne otwarcie pliku wysypuje program...

Proszę o pomoc!
Dziękuję pozdrawiam :)

1

A Spróbuj uzyć jakiejś bazy danych...

2

wywal to i napisz od nowa

tym razem z uzyciem

std::vector
http://stackoverflow.com/questions/6277646/in-c-check-if-stdvectorstring-contains-a-certain-value

algorytm bedziesz miec taki

  1. wczytujesz wszystko do std::vector (jezeli masz duza wartosc danych to mozesz to robic na biezaco, ale chyba nie masz pol gigabajtowych plikow)
  2. znajdujesz wartosc ktora szukasz za pomoca linka ktorego Ci dalem
  3. usuwasz dany rekord z vectora
  4. wpisujesz caly vector do pliku (od poczatku do konca, nie edytujes zpliku tylko caly zapisujesz)
0

Okej, dzięki Panowie za szybką podpowiedź :) Piszę, w razie czego dam znać :P Ale myślę, że teraz problem się rozwiąże.
Pozdrawiam :)

0

Powstały 2 problemy... Jako, że jestem świeży w c++ nie wiem jak to rozwiązać..

  1. Otwieram plik do zapisu, po czym go zamykam. Przeskakuje do innego case i gdy chce otworzyć plik do odczytu - plik się nie otwiera.

  2. Usuwam element wybrany przez użytkownika z std::vector funkcją vector.erase()podając w niej jako parametry vector.erase(vector.begin() + count) gdzie count oznacza element wybrany przez użytkownika. Poniżej wklejam co się dzieje w pliku po tej operacji (usuwam element nr 2 - czyli Test_Test).

// PLIK PRZED: 
Piwo_Tyskie		20		12.12
Test_Test			12		12.21
Test_Test2		31		12.0
Test_Test3		12		12.12

// PLIK PO:
Piwo_Tyskie		20		12.12
Test_Test2		31		12

0

W takim razie wrzucam kod: Pastebin

#Edit:
Dodam, że problem nr 1 zniknął.

1

nie czytasz do konca pliku, dlatego ostatnia linijka jest usuwana

#include <fstream>
std::ifstream infile("thefile.txt");

int a, b;
while (infile >> a >> b)
{
    // process pair (a,b)
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1