Problem z kolejnością przy wczytywaniu z pliku mapy rastrowej do tablicy dynamicznej [C++]

0

Witam,
Próbuję wczytać z pliku mapę do tablicy dynamicznej. Dwa pierwsze wiersze pliku to informacja o liczbie wierszy i kolumn mapy rastrowej (np. lines 10, columns 11), w kolejnych wierszach jest mapa.
Niby wszystko działa, ale kolejność elementów jest w tablicy przesunięta. Kiedy tworzę tablicę ze stałą liczbą elementów (i usuwam z pliku to co nie jest mapą) wszystko działa. Prośba o pomoc. Coś pomijam?

#include "pch.h"
#include <iostream>
#include <fstream>
#include <string>

int lines, columns;

//funkcja odczytujaca z pliku ile jest wierszy i kolumn
void get_file_info(std::string word, int number)
{
	if (word == "lines")
	{
		lines = number;
		std::cout << "number of lines: " << lines;
		std::cout << std::endl;
	}
	else if (word == "columns")
	{
		columns = number;
		std::cout << "number of columns: " << columns;
		std::cout << std::endl;
	}
}

//otwarcie pliku i odczyt danych
bool open_file(std::string file_name)
{
	std::ifstream file;
	file.open(file_name.c_str());
	if (!file.good())
		return false;
	int p = 0;
	while (p < 2)
	{
		std::string a;
		int b;
		file >> a >> b;
		get_file_info(a, b);
		p++;
	}
	file.close();
	return true;
}
int main()
{

	std::string adress = "d:\\mapa4.txt";
	//std::cout << "podaj dane pliku: \n";
	//std::cin >> nazwa;

	if (!open_file(adress))
		std::cout << "File cannot be open!" << std::endl;

	std::ifstream file;
	file.open(adress.c_str());
	char **map;
	map = new char*[lines];

	for (int i = 0; i < lines; i++)
		map[i] = new char[columns];
	//wczytanie danych do tablicy
	while (!file.eof())
	{
		for (int i = 0; i < lines; i++)
		{
			for (int j = 0; j < columns; j++)
				file >> map[i][j];
		}
	}
	//drukowanie tablicy
	for (int i = 0; i < lines; i++)
	{
		for (int j = 0; j < columns; j++)
			std::cout << map[i][j] << '\t';
			std::cout << std::endl;
	}
	delete map;
	file.close();
	std::cout << "file closed. \n";
	return 0;
}

0

Co to znaczy, że jest przesunięta?

0

tzn. elementy, które powinny być na miejscu tablicy[0][0] i dalszych, są na miejscu np. [2][6] i odpowiednio dalej.

0

Możesz przez to że czytasz od początku a tam masz te swoje informacje o rozmiarze tablicy? Na pewno zaczynasz wczytywać od miejsca gdzie zaczynają się faktyczne dane?

0

Mi to wygląda na problem z adresami (ale jestem dosyć początkujący). Wpisałem do mapy losowe znaki i wychodzi, że są wszystkie.
zamiast (tablica 3x3):
!@#
$%^
@..
otrzymuję:
%^@
..!
@#$
Czy to oznacza, że program zaczyna czytać gdzieś w środku, a potem wraca do tego co jeszcze nie przeczytał? Jak to można zmienić, ew. gdzie o tym poczytać?

1

Dwukrotnie otwierasz plik i za drugim razem wczytujesz do tablicy wszystkie znaki od samego początku. Przy pętli while zapętla ci się odczyt (zapisuje kilkukrotnie tablicę).

0
Delor napisał(a):

Dwukrotnie otwierasz plik i za drugim razem wczytujesz do tablicy wszystkie znaki od samego początku. Przy pętli while zapętla ci się odczyt (zapisuje kilkukrotnie tablicę).

Dziękuję, teraz wszystko śmiga.

0
  1. https://dsp.krzaq.cc/post/176/ucze-sie-cxx-kiedy-uzywac-new-i-delete/
  2. while (!file.eof()) jest częstym źródłem bugów
  3. brak specyfikacji formatu, ba nawet nie pokazałeś przykładowego pliku. Rozkminianie formatu pliku z kodu, który nie działa, nie jest najlepszym rozwiązaniem.

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