Problem z dwuwymiarową tablicą typu char

0

Witam
Mam następujący problem, otóż chciałbym pobrać z pliku i wyświetlić dwuwymiarową tablicę char'ów lecz program wyświetla ją w zupełnie innej formie niż jest ona w pliku.

Oto moje funkcje:


bool loadMap(const string file_name, char map[][COLS])
{
	fstream file;

	file.open(file_name, ios::in);

	if (file.is_open())
	{

		for (auto x = 0; x < ROWS; x++)
		{
			for (auto y = 0; y < COLS; y++)
			{
				char temp = ' ';

				temp = file.get();

				switch (temp)
				{
				case '\n': break;

				default:

					map[x][y] = temp;

					break;
				}
			}
		}

		file.close();
		return true;
	}

	else return false;
}

void displayMap(const char map[][COLS])
{
	system("cls");

	for (auto x = 0; x < ROWS; x++)
	{
		for (auto y = 0; y < COLS; y++)
			cout << map[x][y];

		cout << endl;
	}
}

Bardzo proszę o wytłumaczenie mi mojego błędu gdyż głowię się nad tym od dłuższego czasu
Pozdrawiam

1
switch (temp)
{
    case '\n': break;

Ten break powoduje wyjście ze switcha, a nie z zagnieżdżonej pętli. Warunek byłby krótszy i bardziej oczywisty:

for (auto x = 0; x < ROWS; x++)
{
    for (auto y = 0; y < COLS; y++)
    {
        char temp = ' ';
        temp = file.get();

        if(temp != '\n')
            map[x][y] = temp;
        else
            break;
        }
    }
}

A co do poprawności pobierania danych z pliku to ew. zapewne ktoś inny napisze.

0
Z1EMN1AK napisał(a):

Z góry dziękuję za pomoc ale kiedy zastosowałem twój kod, program zaczął wyświetlać tylko co drugą linię zawartości pliku

A jakie separatory są użyte w tym pliku? Windowsowe CRLF, czy linuksowe LF? Obstawiam, że te pierwsze, dlatego program uzupełnia co drugą linię, bo będąc pomiędzy CR a LF niczego nie wczytuje. W rezultacie tablicę wypełnia do końca, wczytując połowę linii z pliku i pozostawiając puste wiersze (w tablicy) o nieparzystych indeksach.


Z drugiej strony, użyte indeksowanie pętli nie jest w tym przypadku najlepsze. Używasz pętli for, która z natury wykonuje określoną liczbę iteracji. Tymczasem z wewnętrznej części kodu (tej w zagniżdżonej pętli) mimo wszystko testujesz załadowany znak, tak jakbyś nie wiedział jak długie są linie w tym pliku. Czyli wychodzi na to, że wiesz ile jest znaków w każdej linii pliku, ale nie jesteś tego pewien, ale też wiesz ile jest linii w pliku i tego jesteś pewien (bo nie sprawdzasz czy osiągnięto koniec pliku).

No to jak jest, wiesz ile jest linii w pliku i znasz ich długość, czy nie wiesz? ;)

0

Tak wiem jaka jest zawartość pliku
W pliku znajduje się 100 znaków w siatce 10x10 nie wiem czemu ale w miejscach gdzie się tego nie spodziewam wyskakują znaki które nie powinny się w danym miejscu znaleźć dla tego sprawdzam co mi pobiera z pliku.
Spróbuję jeszcze zmienić separatory w pliku na linuksowe i dam znać jak zachowuje się program

0

Problem jest w tym, że nie walidujesz końca linii w należyty sposób, przez co Twój kod będzie działał dla jednoznakowego separatora, ale dla dwuznakowego już nie.

Możesz to rozwiązać w inny sposób – ładować całe linie do pomocniczej zmiennej łańcuchowej (co wykluczy problem końca linii) i przepisywać do tablicy znaki z łańcucha. Wystarczy jedna pętla (iterująca po liniach), a kod będzie potrafił ładować pliki bez względu na sposób reprezentacji separatorów linii.

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