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

Getline() nie czyta pierwszego znaku.

Object Storage Arubacloud
0 głosów
730 wizyt
pytanie zadane 11 czerwca 2017 w C i C++ przez TomaszA2 Obywatel (1,720 p.)
	
	int rend[25][80];
	std::string bufor2;
	std::string bufor;
	std::fstream plik;
	plik.open( "plik.txt", std::ios::in );


          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());
			}
		}

 

Tak jak w temacie, czyta mi wszystkie znaki w danej linii poza pierwszym.

Link do wglądu: https://drive.google.com/open?id=0B0G4a8MmpuxoMXpweXRjRXRKQ0E

 

2 odpowiedzi

+1 głos
odpowiedź 11 czerwca 2017 przez j23 Mędrzec (194,920 p.)

Mało prawdopodobne. Pokaż (nie całą) zawartość pliku plik.txt.

komentarz 17 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
Namierzyłem jeszcze dokładniej źródło problemu.

Linijka: for(int b=0; b!=80; b++)

Zmienna B nigdy nie osiąga wartości 0. Nie mam pojęcia jak. (Bo w końcu jest tam b=0, to jak niby mogłoby być inaczej?)
komentarz 17 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)

Jednak tylko w połowie tamta linijka była winna. Po prostu źle bazowałem na wartości B w linijce: obraz.setPosition(b*10, a*10);

 

Ona musiała być przed wyświetleniem, a nie po nim. Zaburzało to cały porządek.

Jeśli:

for(int b=0; b!=80; b++)
        {
            //Sleep(100);
            if(rend[a][b]==1) Okno.draw(obraz);
            obraz.setPosition(b*10, a*10);
        }

To dla:

b=0      rysowało na pikselu 0

b=1      rysowało na pikselu 0 ponieważ jeszcze nie dotarło do setPosition

b=2      rysowało na pikselu 10

b=3      rysowało na pikselu 20

komentarz 17 czerwca 2017 przez j23 Mędrzec (194,920 p.)

setPosition daj przed draw.

komentarz 21 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
Właśnie (no, nie tak do końca ,,właśnie" bo już 3 dni temu) to napisałem z pełnym wyjaśnieniem dlaczego było źle. Nie zauważyłeś?
komentarz 21 czerwca 2017 przez j23 Mędrzec (194,920 p.)

Haha, ostatni komentarz pisałem po wódce, dlatego nie zauważyłem... cóż, zdarza się smiley

0 głosów
odpowiedź 11 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)
Co to za plik? Jeżeli pochodzi on z innego - twojego programu, to polecam ci stworzyć plik binarny.
Jeżeli tworzysz ten plik ty sam, to napisz, a opiszę ci jak to zrobić.
komentarz 11 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
Plik stworzyłem własnoręcznie. Zwykły plik tekstowy.

Chodzi o to że z każdej linii nie wczytuje się jeden znak. Jakby nie istniał. Wyżej wkleiłem kod a jeszcze wyżej masz paczkę w .rar żeby zobaczyć o co mi chodzi.
komentarz 11 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)

Pokażę ci jak łatwo można wyciągnąć tablicę charów. Potem możesz go sobie przekonwertować na int jeżeli będziesz chciał:
 

'6' - '0' == 6;
'5' - '0' == 5;

char znak = '2';
int liczba = znak - '0';
liczba == 2;

Generalnie musisz pamiętać o tym, że istnieją znaki białe.
W twoim przypadku jest to znak końca linii (Na końcu każdej linii xD)
Oraz znak końca pliku (Na końcu pliku),

Jak możesz zobaczyć w kodzie niżej, definiuję tablicę [13][81]. Ale wyświetlam tylko do:
rend[12][79]. Nie ma sensu wypisywać znak nowej linii oraz końca pliku.

#include <iostream>
#include <fstream>

int main() {
	std::fstream file;
	char rend[13][81];
	file.open("input.txt", std::ios::in);
	file.read((char*)rend, sizeof(rend));
	file.close();
	
	for (int y = 0; y < 13; y++) {
		for (int x = 0; x < 80; x++)
			std::cout << rend[y][x];
		std::cout << '\n';
	}

	system("pause");
	return 0;
}

 

komentarz 11 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)

Problem jednak nie leżał w odczytaniu pliku, a jego interpretacji poprzez fragment kodu:

  		for(int a=0; a!=25; a++)
   		{
   			for(int b=0; b!=80; b++)
   			{
   				//Sleep(100);
   				if(rend[a][b]==1) Okno.draw(obraz);
   				obraz.setPosition(b*10, a*10);
			}
			
		}
		
     	Okno.display();
     	Okno.clear(sf::Color(0,0,0));	
	}

 

Niestety jeszcze nie wiem jak to naprawić.

komentarz 11 czerwca 2017 przez Knayder Nałogowiec (37,640 p.)
Czemu sprawdzasz pętlę w taki dziwny sposób?
a!=25

Rób tak:
a<26
komentarz 11 czerwca 2017 przez TomaszA2 Obywatel (1,720 p.)
Ciekawy sposób. Ale zanim zacznę robić cokolwiek w kodzie, wolałbym wpierw naprawić ten błąd z brakującą kolumną pierwszych znaków w linii.

Podobne pytania

0 głosów
2 odpowiedzi 355 wizyt
pytanie zadane 14 grudnia 2015 w C i C++ przez dichloroetylobenzen Użytkownik (850 p.)
0 głosów
1 odpowiedź 557 wizyt
0 głosów
1 odpowiedź 449 wizyt
pytanie zadane 29 grudnia 2015 w C i C++ przez martix3 Użytkownik (690 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

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

...