Wczytywanie z pliku txt i konwersja tekstu na int

2011-09-29 13:52
mto9
0

Witam. Mam plik txt o strukturze:

4 5
1 2
2 3
1 3
3 4
1 4

I mam polecenie wczytanie tego tekstu jako zmiennych typu int. Chodzi mi tylko o algorytm.. wymyśliłem cos takiego:

1.Wczytuje znaki do tablicy charów az nie napotkam znaku spacji lub nowej lini.
2.Zamieniam 1 element tablicy charó na int poprzez zależności ASCII czyli np. cyfra 1 w ascii to 49, cyfra 2 w asii to 50 i jezeli wczytalem tylko 2 znaki przed napotkaniem nowej lini lub spacji wykonuje polecenie

int liczba=10*z_ascii_na_int(ch[0])+z_ascii_na_int(ch[1]);

gdzie funkcja z_ascii_na_int() zmienia znak ascii na odpowiednia wartosc int. dla 3 cyfrowej liczby wygladalo by to tak:


int liczba=100*z_ascii_na_int(ch[0])+10*z_ascii_na_int(ch[1])+z_ascii_na_char(ch[2]);
3.Wracam do kroku 1 jeżeli nie uzyskałem końca pliku.

I teraz moje pytanie: Czy istnieje jakiś szybszy sposów? W szczególności zależy mi na szybkości! z góry dziękuje na pomoc:)
edytowany 1x, ostatnio: madmike, 2016-12-13 18:26

Pozostało 580 znaków

2011-09-29 14:06
0

może przy wczytywaniu użyj fscanf(plik,"%d",&liczba);
lub bardziej cplasplasowo:
strumien >> liczba;

btw w c++:
int liczba = 0;
dla_kazdego_znaku_czytajac_od_lewej:
liczba*=10;
liczba+=znak='0';

albo funkcja atoi


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 2x, ostatnio: krwq, 2011-09-29 14:09

Pozostało 580 znaków

2011-09-29 14:07
0

A jaki język? Bo w .NET jest np. Convert.ToInt32(string) i nie trzeba iterować po cyfrach, jak przypuszczam zapewne w Javie, python'ie etc też są podobne funkcje :)

Pozostało 580 znaków

2011-09-29 14:10
asd
0

Język jaki?

c++
http://ideone.com/iIMjO

W C robisz podobnie.
Otwierasz plik i później za pomocą fscanf czytasz liczby. fscanf(plik, "%d %d", &li1, &li2) - zerknij do dokumentacji

Pozostało 580 znaków

2011-09-29 14:52
0

Jeżeli język to C#

List<int> list = new List<int>();
string line;
while ( (line= reader.ReadLine()) != null)
{
   list.AddRange(line.Split(new char[] { ' ', '\t' },StringSplitOptions.RemoveEmptyEntries).Select(p => int.Parse(p)));
}

to chyba prościej się nie da ;]

EDIT: tag dodany po moim poście ;)

edytowany 2x, ostatnio: Sarrus, 2011-10-05 09:25

Pozostało 580 znaków

2011-09-29 15:29
0

spróbowałbym tak:

    int i=0;
    int temp;
    std::vector <int> liczba;
    ifstream plik;
    plik.open("pliczek.txt");
    if(plik.good())
    {
        while(!plik.eof())
        {
            plik >> temp;
            liczba.push_back(temp);
            i++;
        }
    }

tylko musiałbyś pamiętać, że ostatni element w tablicy jest powtórzeniem przedostatniego co jednak da się łatwo wyeliminować :).

Pokaż pozostałe 2 komentarze
No właśnie tak myślałem.. ja może nie odczuje ale chodzi o to, że rywalizuje z innymi uczniami mojej szkoły i liczy się każda nanosekunda ;D Może program Madm4n bedzie najodpowiedniejszy? - mto9 2011-09-29 21:07
wiesz co, specem nie jestem. Najlepiej gdyby wypowiedział się ktoś z większą wiedzą. Jeżeli znasz ilość liczb jaka będzie w pliku to możesz użyć tablicy statycznej. Czy to coś da, ciężko mi powiedzieć -> może warto jest szukać ulepszeń w innych miejscach programu?. Musiałbyś pokazać coś więcej żeby ktoś mógł spróbować Ci tutaj pomóc :) - Puchaczov 2011-09-29 21:45
Wygląda to tak pierwszy wiersz druga kolumna informuje nas o liczbie następnych wierszy.. - mto9 2011-09-29 22:31
no tyle, że ten kod ma standardowy błąd początkującego z STL. Powinno być: while(plik >> temp) liczba.push_back(temp); Komu potrzebne jest "i"? vector udostępnia swój rozmiar. - MarekR22 2011-09-30 13:28
dzięki za poprawkę, teraz autor tematu ma pełny obraz jak tego użyć :) - Puchaczov 2011-09-30 13:37

Pozostało 580 znaków

Liczba odpowiedzi na stronę

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