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

Zapisywanie do pliku tablicy [y][x]

Object Storage Arubacloud
0 głosów
294 wizyt
pytanie zadane 21 czerwca 2017 w C i C++ przez TomaszA2 Obywatel (1,720 p.)
for(int g=0; g<26; g++)
		{
			
			for(int h=0; h!=80; h++)
			{
				//bufor3="";
				bufor3=rend[g][h]+'0';
				//plik.write( & bufor3[ 0 ], bufor3.length() );
				plik << bufor3;
				
				plik.clear();
				plik.flush();
			}
			//bufor3="\t";
			//plik.write( & bufor3[ 0 ], bufor3.length() );
			plik << "\t";
			plik.clear();
			plik.flush();
		}

 

Problem polega na tym że do pliku na całą kolumnę zapisują się te same wartości co w jej pierwszej linii.

Wygląda to tak jakby g miało zawsze wartość 0.

komentarz 21 czerwca 2017 przez draghan VIP (106,230 p.)
TomaszA2 - pokaż kontekst, czyli większy fragment kodu. Czym dokładnie jest rend, bufor3, plik, co z tymi zmiennymi robisz przed wejściem w pętle oraz po wyjściu z nich.
komentarz 21 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <SFML/System.hpp>
#include <cmath>
#include <windows.h>
#include <stdio.h>
#include <cstdarg>
#include <stdlib.h>
#include <cstdlib>
#include <math.h>
#include <time.h>
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include <sstream>
#include <iostream>

int main()
{
	std::string bufor3;
	sf::Vector2i mysz;
	int myszX;
	int myszY;
	int rend[25][81];
	std::string bufor2;
	std::string bufor;
	std::fstream plik;
	plik.open( "plik.txt", std::ios::in | std::ios::out);
	for(int e=0; e!=25; e++)
	{
		getline(plik, bufor);
		for(int f=0; f!=80; f++)
		{
			bufor2=bufor[f];
			rend[e][f]=atoi(bufor2.c_str());
		}
	}
	
	int obrazY=0;
	int obrazX=0;
    sf::RenderWindow Okno(sf::VideoMode( 800, 250, 32 ) ,"Test");
    sf::Texture test;
    test.loadFromFile("tekstury/test.BMP");
    sf::Sprite obraz;
    obraz.setTexture(test);
    Okno.setFramerateLimit(60);
    //Okno.create(sf::VideoMode( 400, 400, 32 ) ,"", sf::Style::None);
    while(Okno.isOpen())
    {
     	sf::Event zdarzenie;
     	while( Okno.pollEvent( zdarzenie ) )
     	{
		    if( zdarzenie.type == sf::Event::Closed )
    		{
           		
   				Okno.close();
   			}
		}
        if(sf::Keyboard::isKeyPressed( sf::Keyboard::Left )) obrazX-=3;
   		if(sf::Keyboard::isKeyPressed( sf::Keyboard::Right )) obrazX+=3;
   		if(sf::Keyboard::isKeyPressed( sf::Keyboard::Up )) obrazY-=3;
   		if(sf::Keyboard::isKeyPressed( sf::Keyboard::Down )) obrazY+=3;
   		//=
   		obraz.setPosition(obrazX, obrazY);
		plik.seekg(0);
   		Okno.clear(sf::Color(0,0,0));	
   		for(int e=0; e!=25; e++)
		{
			getline(plik, bufor);
			for(int f=0; f!=80; f++)
			{
				bufor2=bufor[f];
				rend[e][f]=atoi(bufor2.c_str());
			}
		}
		if(sf::Mouse::isButtonPressed(sf::Mouse::Left))
   		{
   			mysz=sf::Mouse::getPosition(Okno);
   			myszX=mysz.x/10;
   			myszY=mysz.y/10;
   			if(myszY>24)myszY=24;
   			if(myszY<0)myszY=0;
   			if(myszX>79)myszX=79;
   			if(myszX<0)myszX=0;
   			
   			if(rend[myszY][myszX]!=1) rend[myszY][myszX]=1;
   			else if(rend[myszY][myszX]==1) rend[myszY][myszX]=0;
		}
		
   		for(int a=0; a<26; a++)
   		{
   			for(int b=0; b!=80; b++)
   			{
   				//Sleep(100);
   				obraz.setPosition(b*10, a*10);
   				if(rend[a][b]==1) Okno.draw(obraz);
   				
			}
			
		}
		
		plik.close();
		plik.open( "plik.txt", std::ios::trunc | std::ios::out);
		for(int g=0; g<26; g++)
		{
			
			for(int h=0; h!=80; h++)
			{
				//bufor3="";
				bufor3=rend[g][h]+'0';
				//plik.write( & bufor3[ 0 ], bufor3.length() );
				plik << bufor3;
				
				plik.clear();
				plik.flush();
			}
			//bufor3="\t";
			//plik.write( & bufor3[ 0 ], bufor3.length() );
			plik << "\t";
			plik.clear();
			plik.flush();
		}
		plik.close();
		plik.open( "plik.txt", std::ios::in | std::ios::out);
     	Okno.display();
     	
	}
	plik.close();
    return 0;
}

 

Skopiowałem całość tak jak mam otwartą, możliwe że coś tam próbowałem w międzyczasie i jest jakoś inaczej niż we wcześniejszym fragmencie.

Co do materiałów z których się uczyłem. Wszystko. Dosłownie. Jak czegoś potrzebowałem to wpisywałem w google. Najwięcej bazowałem na materiałach ze strony cpp0x.pl. (albo cppox.pl) Z ich kursu uczyłem się na początku. Potem zacząłem jakoś tak chaotycznie ze wszystkiego.

komentarz 21 czerwca 2017 przez Michał Kazula Pasjonat (19,540 p.)

Boże. 

Podziel kod na funkcje bo nie da się tego czytać :-)

A pewny jesteś że w pliku zapisują się dane?

http://cpp0x.pl/kursy/Kurs-C++/Obsluga-plikow/305

komentarz 21 czerwca 2017 przez draghan VIP (106,230 p.)
Format tego pliku tekstowego to jest 25 linii po 80 cyfr ciągiem?
komentarz 21 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
edycja 21 czerwca 2017 przez TomaszA2
Michał. Podziałem zajmuję się w takich małych projektach jak już jest wszystko gotowe. Łatwiej mi się tak uczyć jak mam wszystko po kolei. Taki projekt robię pierwszy raz. (najprostszy możliwy edytor ,,grafiki" w czasie rzeczywistym) Kiedyś zrobię bardziej złożony.

Jestem pewien ponieważ tam jest trunc | out czyli najpierw czyści plik a potem nadaje uprawnienia do zapisu, po czym zapisuje to co zapamiętało w tablicy. (ze zmianami)

Otwierałem też plik tekstowy z tym. Na pewno się zapisuje. Mogę wysłać wam paczkę ze wszystkim gotowym do uruchomienia jak chcecie.

Draghan. Dokładnie. 25 linii po 80 znaków. (wszystko 0 i 1)

 

Na samym początku zapomniałem wspomnieć że trwała zmiana wartości (wraz z zapisem, niestety na całą kolumnę) działa tylko w tym rzędzie który jest oznaczony wartością zmiennej g. (if(g==1) to tylko na rzędzie nr 1)

1 odpowiedź

+2 głosów
odpowiedź 21 czerwca 2017 przez draghan VIP (106,230 p.)
wybrane 22 czerwca 2017 przez TomaszA2
 
Najlepsza

Pierwszy błąd, który widzę: oczekujesz pliku 25-liniowego, a zapisujesz całość w jednej linii, rozdzielonej tabulacją (kod poniżej).

plik << "\t"; // powinno być '\n' zamiast '\t'

Drugi błąd to przekroczenie zakresu tablicy. W pętli operującej na tablicy rend[25][81] masz:

for(int g=0; g<26; g++)

gdzie g powinno być ograniczone do wartości [0; 24], a więc warunek powinien wyglądać tak:

for(int g=0; g<25; g++)

Swoją drogą, wydaje mi się bardzo dziwnym pomysłem odczyt i zapis do pliku co klatkę. W mojej opinii powinieneś na bieżąco operować po prostu na tablicy i zapisywać jej zawartość do pliku dopiero przy kończeniu programu. Czytanie i zapis do pliku są operacjami bardzo wolnymi, w porównaniu z operacjami na zmiennych w RAM i nie powinieneś tego robić co klatkę.

komentarz 22 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
,, powinno być '\n' zamiast '\t' "

To było to.
komentarz 22 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
edycja 22 czerwca 2017 przez TomaszA2
Masz może pomysł jak mógłbym zrobić aby 1 na 0 lub odwrotnie zmieniały się dopiero gdy puszczę przycisk[lewy przycisk myszy]? Chciałbym to już zakończyć, uporządkować i odstawić na rzecz innych projektów.

 

Edit. W sfml wystarczyło umieścić jako zdarzenie puszczenia przycisku myszy zmianę zmiennej działającej jako przełącznik. Teraz męczę się jak zrobić żeby umożliwić temu ciągłe działanie.

Edit2. Potrzebuję czegoś wydajniejszego. Badziewnie te eventy w sfml działają.
komentarz 22 czerwca 2017 przez draghan VIP (106,230 p.)

Masz może pomysł jak mógłbym zrobić aby 1 na 0 lub odwrotnie zmieniały się dopiero gdy puszczę przycisk[lewy przycisk myszy]?

To wygląda jak klasyczne zadanie dla obsługi eventów.

Edit2. Potrzebuję czegoś wydajniejszego. Badziewnie te eventy w sfml działają.

Śmiem twierdzić, że z nimi raczej wszystko w porządku. Pokaż, co tam nakodziłeś.

komentarz 24 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
Już działa, było tam trochę kodu z moich prób jeszcze. (np. niepotrzebny warunek w ifie) Pousuwałem i jest dobrze.

Podobne pytania

–5 głosów
2 odpowiedzi 539 wizyt
0 głosów
0 odpowiedzi 1,718 wizyt
pytanie zadane 14 września 2020 w Python przez urbix01 Gaduła (3,290 p.)
+1 głos
2 odpowiedzi 398 wizyt
pytanie zadane 6 września 2016 w C i C++ przez Helmik Użytkownik (680 p.)

92,555 zapytań

141,403 odpowiedzi

319,557 komentarzy

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

...