Autor Zpráva
Werewolf
Profil
Zdravím.

Nic jsem nenašel o tom, jak uložit pole čísel (int[,]) do souboru a potom ho znovu načíst.
Poradíte někdo, prosím?

Díky :-)
Timy
Profil
public static string Matrix2String(int[,] matrix)
{
    StringBuilder sb = new StringBuilder();

    for (int i = 0; i < matrix.GetLength(0); i++)
    {
        for (int j = 0; j < matrix.GetLength(1); j++)
        {
            sb.AppendFormat("{0} ", matrix[i, j]);
        }
        sb.AppendLine();
    }

    return sb.ToString();
}


Tahle metoda ti převede matici čísel řetězce ve tvaru:

1 2 3
4 5 6


To pak uložíš. A metodu, která ti načte, už si napiš sám ;).
Werewolf
Profil
Timy:
Fajn, řešení mi funguje, chápu, jak funguje.
Díky a zkusim najít něco o ukládání do souboru a napsat tu metodu... Neexistuje v C# něco jako explode?
Sakra, musím jít...
Chamurappi
Profil
Reaguji na Werewolfa:
zkusim najít něco o ukládání do souboru
Na obyčejné rychlé uložení stačí statická metoda File.WriteAllText(String soubor, String obsah).

Neexistuje v C# něco jako explode?
Myslíš něco jako to, čemu drtivá většina jazyků říká Split? Ano, existuje. Hledej Split.
Werewolf
Profil
Chamurappi:
Díky, File.WriteAllText mi funguje.
Taky jsem našel File.ReadAllText, taky funguje.

Jenže když jsem zkoušel převrátit Timyho metodu, setkal jsem se s problémem:

public static int[,] String2Matrix(string matrix)
        {
            char[] delim = { '\n' };
            char[] delim2 = { ' ' };
            string[] splmatrix = matrix.Split(delim);
            string[] splmatrix2 = splmatrix[0].Split(delim2);
            int[,] ret = new int[splmatrix.Length, splmatrix2.Length];
            for (int i = 0; i < splmatrix.Length; i++)
            {
                string[] spl = splmatrix[i].Split(delim2);
                for (int y = 0; y < spl.Length; y++)
                {
                    string replaced = spl[y].Replace("\n", null);
                    int parsed = Int32.Parse(replaced);
                    ret[i, y] = parsed;
                }
            }
            return ret;
        }


Hlásí to vyjímku „Vstupní řetězec nemá správný formát.“. Poradíte někdo, prosím?

Vím, že vám všem lezu na nervy, jak všechno zkazím, a omlouvám se... Díky
Chamurappi
Profil
Reaguji na Werewolfa:
Nemůže být problém v tom, že StringBuilder.AppendLine() vkládá \r\n a nikoliv jen \n?
Hrátky s texty jsou sice zábavné, ale jestli nepotřebuješ, aby byl soubor lidsky čitelný, bylo by asi efektivnější i jednodušší zvolit binární formát.
Timy
Profil
A taky bacha na to, že ta moje funkce to nevrátí zrovna v dobrém tvaru :-).

1_2_3_
4_5_6_
[newline]


(Podtržítko značí mezeru.) Zkusil jsi to třeba debugovat? Zjistil bys, že ti to padá na tom, že se do „string replaced“ uloží právě „\r“.
Werewolf
Profil
Chamurappi:
Odstranil jsem i \r a nic. Bohužel potřebuji i to, aby byl soubor lidsky čitelný...
Werewolf
Profil
Zdravím vás všechny. Znovu.

Mám jeden problém... Potřeboval bych zjistit, kolik prvků v dvourozměrném poli má první index (pole[index, index]).
Pokud jste mě nepochopili (sám se skoro nechápu), tak chci znát to druhé číslo v hranatých závorkách (v případě pole[x, y] je to y).

Díky :-)
Timy
Profil
Werewolf:
Zkus prozkoumat tu mou funkci Matrix2String.
Werewolf
Profil
Timy:
Já oslík... Díky :-)
Werewolf
Profil
Ještě jsem opravil problém s tím, že se mi přidávaly indexy, zapomněl jsem odečíst jedničku.
Až teď jsem si díky té chybě všiml, že pokud položce dvourozměrného pole čísel nedám hodnotu, bude tam automaticky nula. To se hodí, vzhledem k tomu, že nejdříve vytvářím pole a plním ho nulami v cyklu. Ten cyklus teď můžu vypustit a ušetřit čas.

Můžete očekávat, že budu mít problém s nějakou chybou...
Zatím děkuji všem

Vyvolána vyjímka OutOfMemoryException :-D

Vaše odpověď

Mohlo by se hodit

Příspěvky nesouvisející s webem budou odstraněny.

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: