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

c++ złe wczytywanie/wpisywanie/coś jeszcze innego do pliku

Object Storage Arubacloud
0 głosów
230 wizyt
pytanie zadane 28 sierpnia 2020 w C i C++ przez hihijsonel Obywatel (1,250 p.)
otagowane ponownie 28 sierpnia 2020 przez hihijsonel

Witam.

Mam taki program : 

 

#include <iostream>
#include <fstream>using namespace std;

fstream plik("..\\..\\jakis_folder\\jakis_folder_v2\\jakis_plik.txt", ios::in | ios::out);

int main(int argc, char** argv) {
    switch(plik.good()) {
        case true: {
            std::cout << "wszystko ok" << std::endl;
            break;
        }
        case false: {
            std::cout << "wszystko zle";
            return 0;
            break;
        }
        default: {
            std::cout << "wszystko bardzo zle";
            return 0;
            break;
        }
    }
    char cos[50];
    plik.getline(cos, 50);
    plik << "no cos tam";
    cout << std::endl << cos;
    return 0;
}

 

Z jakiś powodów i wypisywane na ekran, i do pliku jest "nono cos tam".

Czy może mi ktoś powiedzieć co zrobiłem źle?

Kod mam po części z internetu więc może w tym problem, jednak kompilator nie pokazuje mi błędu.

Z góry dziękuję za pomoc.

PS. Kompilator Dev cpp

komentarz 28 sierpnia 2020 przez TOWaD Mądrala (5,700 p.)
przywrócone 28 sierpnia 2020 przez TOWaD

może to cos pomoże

Modifies the elements in the array pointed by s and the stream object.

http://cplusplus.com/reference/istream/istream/getline/

tak na moje oko to łączysz ze sobą wskaźnik do tablicy, i do pliku.

2 odpowiedzi

0 głosów
odpowiedź 28 sierpnia 2020 przez Piotr Batko Stary wyjadacz (13,190 p.)
wybrane 29 sierpnia 2020 przez hihijsonel
 
Najlepsza

Za pierwszym razem gdy uruchomiłeś ten program nie powinno tak być, ale za każdym kolejnym razem takie działanie jest poprawne. Za pierwszym razem na ekranie powinno być czysto. Przejdźmy sobie przez Twój kod:

// Zakładam, że w tym momencie w pliku
// znajduje napis "no cos tam"
char cos[50];
plik.getline(cos, 50);
// W tym momencie zmienna cos zawiera
// "no cos tam"
plik << "no cos tam";
// Nadpisałeś zawartość pliku tym samym
// co w nim i tak już było
cout << std::endl << cos;
// Na ekranie widać "no cos tam"

Rozważ jeszcze jeden przypadek. Jak std::fstream::getline napotka koniec pliku, a nic nie wczyta (bo np. plik dopiero co powstał, jak za pierwszym razem gdy uruchomiłeś program) to pozostawi tablicę cos w niezmienionym stanie. Ona jest niezainicjalizowana, zatem zawiera nie wiadomo co. To znaczy, że nie powinieneś jej wypisywać, bo próba odczytu zawartości takiej tablicy to niezdefiniowane zachowanie (undefined behavior). Rozwiązania widzę dwa. Jeżeli już później nie będziesz nic czytał z pliku, to po prostu zainicjalizuj tablicę. Napisz np. char cos[50] = "";. Jeżeli zamierzasz jeszcze z niego korzystać, to należałoby sprawdzić, czy po wywołaniu getline-a w Twoim pliku nie została ustawiona flaga std::ios::failbit, no i naprawić sytuację gdy została.

komentarz 28 sierpnia 2020 przez hihijsonel Obywatel (1,250 p.)
Dziękuję!

Własnie o to mi chodziło. Wszystko już działa dobrze. Poza tym bardzo fajnie wyjaśniłeś jak co działa :)
0 głosów
odpowiedź 28 sierpnia 2020 przez Kacperxoo Początkujący (330 p.)
#include <iostream>
#include <fstream>

using namespace std;

int main()
{
	fstream file;

	file.open("adresDoPliku.txt", ios::out);

	file << "no cos tam";

	file.close();
    return 0;
}

Kod wyżej zapisuje do pliku.

Kod niżej wypisuje z pliku.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
	fstream file;

	string line;

	string x, y, z;

	int lineNumber = 1;

	file.open("adresDoPliku.txt", ios::in);

	if (file.good() == false)
	{
		cout << "File does not exist" << endl;
		exit(0);
	}

	while (getline(file, line))
	{
		if (lineNumber == 1)
		{
			x = line;
		}
		else if (lineNumber == 2)
		{
			y = line;
		}
		else if (lineNumber == 3)
		{
			z = line;
		}

		lineNumber++;
	}

	file.close();

    return 0;
}

Generalnie zamiast tych trzech if'ów możesz użyć switcha, jeśli jest tego więcej.

Z tego co zrobiłeś źle, to brak pętli, która będzie wyciągać kolejne linijki z pliku, w miejsce zapisu linijki wpisałeś 50, a musi być tam zmienna string, która przekazuje pobrane linie dalej. Jako pierwszy argument w getline wpisuje się zmienną fstream, czyli w twoim wypadku plik. Po skończeniu korzystania z plikupowinieneś jeszcze napisać plik.close();

komentarz 28 sierpnia 2020 przez Kacperxoo Początkujący (330 p.)
Zapomniałem jeszcze dodać, że #include <string> dodałem ze względu na to, że Visual Studio wymaga tej biblioteki, jeśli chce się użyć getline. Jeśli dobrze pamiętam np. w CodeBlocksie nie trzeba z tego korzystać
komentarz 28 sierpnia 2020 przez tkz Nałogowiec (42,000 p.)
Nie jest to zależne stricte od środowiska, a kompilatora.

Podobne pytania

0 głosów
2 odpowiedzi 165 wizyt
pytanie zadane 5 marca 2020 w HTML i CSS przez fff Gaduła (3,950 p.)
0 głosów
2 odpowiedzi 116 wizyt
pytanie zadane 20 stycznia 2019 w JavaScript przez Kubs Mądrala (5,190 p.)

92,570 zapytań

141,422 odpowiedzi

319,643 komentarzy

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

...