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

Zgłoszony wyjątek przy próbie zapisu do pliku tekstowego

Object Storage Arubacloud
+1 głos
368 wizyt
pytanie zadane 22 marca 2021 w C i C++ przez DzikieHarce Użytkownik (690 p.)

Napisałam funkcję która ma za zadanie edytować status książki w pliku z zajętego na wypożyczony, bądź odwrotnie, jednak na razie chcę zająć się tylko jedną opcją. Dane w pliku są zapisanie osobno w każdej linii. Zmienna która mówi nam o dostępności książki jest typu bool. A więc chciałabym zmienić jej status z 1 na 0. Poza tym cały plik powinien się nie zmieniać. Próbowałam w ten sposób:

void zmien(int jak, int idSzuk)
{
	ifstream plik, plik1;
	int ilosc;
	string linia;
	string idSz = to_string(idSzuk);
	plik.open("Popularnonaukowe.txt");
	plik1.open("PopularnonaukoweIlosc.txt");
	plik1 >> ilosc;
	plik1.close();
	string* ktab = new string[ilosc];
	//vector<string> ktab;
	for (int i = 0; i < ilosc; i++)
	{
		plik >> ktab[i];
	}
	//while (getline(plik, linia))                   
	//{
	//	ktab.push_back(linia);
	//}
	plik.close();
	ofstream plik2;
	plik2.open("Popularnonaukowe.txt");
	int i;
	for (i = 0; i < ilosc; i++)
	{
		if (ktab[i] == idSz)
		{
			break;
		}
	}
	ktab[i] = "0";
	for (int b = 0; b < ilosc; b++)
	{
		plik2 << ktab[b] << endl;
	}
	plik2.close();
	delete[] ktab;
}

jednak przy zapisie wywala mi wyjątek i ostatecznie plik zostaje nienaruszony. Starałam się też zrobić to na vectorach ale bezskutecznie. Trochę się pomęczyłam i skończyły mi się już pomysły. Wiecie może co mogłoby być nie tak?

komentarz 22 marca 2021 przez Great Stary wyjadacz (12,360 p.)
Podaj przykładową zawartość plików "Popularnonaukowe.txt", "PopularnonaukoweIlosc.txt" przed i po wywołaniu funkcji. Jaki wyjątek został wyrzucony?
komentarz 22 marca 2021 przez DzikieHarce Użytkownik (690 p.)
Popularnonaukowe:

Spal te wode
Tim James
2005
1
0
Chemia
Krotka chistoria czasu
Stephen Hawking
2011
2
1
Fizyka

Ilosc na tylko jedna liczbę, w tym przypadku 2

Wyjątek:

Zgłoszono wyjątek w lokalizacji 0x7AFF3DAF (vcruntime140d.dll) w Projekt Biblioteka.exe: 0xC0000005: Naruszenie zasad dostępu podczas zapisywania w lokalizacji 0x0061006E

Edit:

Warto jeszcze dodać że id jest nad informacją o dostepnosci. Mam błąd w programie bo zapisuję to 0 jako id, wiec zmieniłam ktab[i] na ktab[i+1], jednak wcześniej też powinno działać.

1 odpowiedź

+2 głosów
odpowiedź 22 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
wybrane 22 marca 2021 przez DzikieHarce
 
Najlepsza

Dzień dobry:
pierwszym błędem jest to, że ilość określa ilość pozycji a nie ilość linii w pliku.
Dodatkowo takie pobieranie pobiera tylko 1 wyraz:

for (int i = 0; i < ilosc; i++)
        plik >> ktab[i];

a wyjątek pojawia się tutaj:

ktab[i] = "0";

ponieważ, po wyjściu z pętli i=2, a jest to poza zakresem tablicy.
Z tego co widzę na opis książki składa się 6 linii. Tablica powinna mieć wielkość 6*ilość, oraz powinna Pani pobierać całe linie z pliku, przy użyciu getline:

ilosc *= 6;
string ktab = new string[ilosc];
for (int i = 0; i < ilosc; i++) 
    getline(plik, ktab[i]);


 

komentarz 22 marca 2021 przez DzikieHarce Użytkownik (690 p.)

Działa, bardzo dziękuję, za bardzo zapatrzyłam się na poprzednią funkcję gdzie tylko wczytywałam.

Oto poprawny kod:

void zmien(int jak, int idSzuk)
{
	ifstream plik, plik1;
	int ilosc;
	string linia;
	string idSz = to_string(idSzuk);
	plik.open("Popularnonaukowe.txt");
	plik1.open("PopularnonaukoweIlosc.txt");
	plik1 >> ilosc;
	plik1.close();
	string* ktab = new string[ilosc*6];
	for (int i = 0; i < ilosc*6; i++)
		getline(plik, ktab[i]);
	for (int i = 0; i < ilosc*6; i++)
	{
		cout << ktab[i] << endl;
	}
	plik.close();
	ofstream plik2;
	plik2.open("Popularnonaukowe.txt");
	int i;
	for (i = 0; i < ilosc*6; i++)
	{
		if (ktab[i] == idSz)
		{
			break;
		}
	}
	if(jak==1)
	{
		ktab[i + 1] = "0";
	}
	else
	{
		ktab[i + 1] = "1";
	}
	for (int b = 0; b < ilosc*6; b++)
	{
		plik2 << ktab[b] << endl;
	}
	plik2.close();
	delete[] ktab;
}

 

komentarz 22 marca 2021 przez Michał Muzyka Pasjonat (24,080 p.)
na pewno można by trochę oczyścić kod, żeby uniknąć magic numbers i mnożenia przez stałą przy każdej pętli i sprawdzić poprawność otwarcia plików, ale funkcjonalnie prawdopodobnie jest dobrze
komentarz 22 marca 2021 przez DzikieHarce Użytkownik (690 p.)
Raczej jeszcze nastąpią zmiany, jednak najważniejsze że działa ;D

Podobne pytania

0 głosów
1 odpowiedź 1,665 wizyt
0 głosów
2 odpowiedzi 617 wizyt
0 głosów
2 odpowiedzi 1,460 wizyt
pytanie zadane 29 marca 2016 w C i C++ przez L33TT12 Gaduła (3,950 p.)

92,695 zapytań

141,606 odpowiedzi

320,106 komentarzy

62,052 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

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!

...