WINAPI Pobranie danych z pliku (LPSTR) - problem z wydzieleniem odpowiednich danych

0

Witam. Mam problem z programem. Pobieram z pliku dane (listę sąsiedztwa) po czym później chcę jej użyć do policzenia najkrótszej drogi algorytmem Dijkstry. Program piszę w C++ w programie Microsoft Visual C++ 2010 Express.

inline void pobierz_dane()
{
LPSTR Bufor2;
DWORD dwRozmiar, dwPrzeczyt;
HANDLE hPlik;
 
hPlik = CreateFile (NazwaPliku, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hPlik == INVALID_HANDLE_VALUE) {
 MessageBox (NULL, "Nie można otworzyć pliku.", "A to pech!", MB_ICONEXCLAMATION);
 PostQuitMessage (0); // Zakończ program
}
 
dwRozmiar = GetFileSize (hPlik, NULL);
if (dwRozmiar == 0xFFFFFFFF) {
 MessageBox (NULL, "Nieprawidłowy rozmiar pliku!", "Niedobrze...", MB_ICONEXCLAMATION);
 PostQuitMessage (0); // Zakończ program
}
 
Bufor2 = (LPSTR)GlobalAlloc(GPTR, dwRozmiar+1);
if(Bufor2 == NULL) {
 MessageBox(NULL, "Za mało pamięci!", "Ale wiocha...", MB_ICONEXCLAMATION);
 PostQuitMessage(0); // Zakończ program
}
 
if (!ReadFile (hPlik, Bufor, dwRozmiar, &dwPrzeczyt, NULL)) {
 MessageBox (NULL, "Błąd czytania z pliku", "Dupa blada!", MB_ICONEXCLAMATION);
 PostQuitMessage (0); // Zakończ program
}


Bufor2[dwRozmiar] = 0; // dodaj zero na końcu stringa

GlobalFree (Bufor); // Zwolnij bufor
CloseHandle (hPlik); // Zamknij plik
}

W ten sposób pobieram dane z pliku. Chcialem to zrobic normalnie fstreamem, ale w programie wyskakuje mi błąd : Identifier "ifstream" is undefined, pomimo że dołączam wszystkie biblioteki. Jednak w ten sposób wczytuję z pliku całość, a potrzebne mi są kolejne dane, które w pliku są oddzielane spacją. Jak mam zczytywać dane do białego znaku??

Plik przykładowo wygląda tak:

11
1 3 9 7
1 2 5 3
2 3 3 4
2 1 4 8
3 1 6 11
4 2 3 4
3 4 5 4
4 3 2 2
2 4 6 4
3 1 2 5

Do pracy z algorytmem potrzebuję poszczególne kolumny wczytywac do zmiennych, tzn 1 kolumna to 1 zmienna. Przy użyciu fstreama robilem pętle i i zczytywalem najpierw 1 wiersz a pozniej kolejne poprzez "plik>>x>>y>>k>>t;"

Nie wiem dlaczego nie mogę tego samego sposobu zastosować w MV C++ 2010 Express... Program z fstreamem robiłem w CodeBlocksie i wszystko było ok, z tym, że jeśli kopiuję ten kod do Codeblocksa to wyskakuje mi jakiś błąd: Undefined reference to "winmain" czy cos takiego.

Jak to rozwiązać? Szukałem długo w necie i jedyne co znalazłem to jakaś funkcja do znajdywania okreslonych liter, jednak przez przypadek zamknalem okno, a historia mi sie nie zapisuje i nie pamietam jej. Byla na literę "s" chyba...

Proszę o pomoc w rozwiązaniu problemu, bo nie wiem już zupełnie jak to zrobić...

0

Korzystając z ReadFile() musisz sam zczytywać bajt po bajcie i sprawdzać co zostało odczytane, w WINAPI nie ma funkcji, które zczytają dane z pliku, sprawdzą czy to np. spacja i przestaną czytać.

0

Tzn wiem, że w WinApi poprzez ReadFIle() pliki i dane są traktowane jako zwykłe bajty niezależnie od zawartości pliku. Problem w tym, że nie wiem jak sprawdzić co jest liczbą, a co znakiem białym...

Skoro w jednym wierszu mam dane, które trafiają do 4 zmiennych to czy powinienem tego LPSTRa przekonwertowac jakos do stringa albo zrobic bufor poprzez tablicę charów?? Tylko w tym wypadku jak przejsc po tablicy i oddzielic liczby od znaków białych, żeby w odpowiedniej kolejności trafiały do zmiennych?
Ten 1 wiersz w pliku to ilosc polaczen w grafie, następnie wszystkie pozostałe wiersze: 1 wartość do zmiennej x, 2 do y, 3 do k, a 4 do t. Nie mam pomysłu jak sobie z tym poradzić... Nie proszę o gotowy kod, chociaż kawałek kodu przejścia po tablicy by nie zaszkodził... Myślałem dość długo nad tym, ale nie mam pomysłu do końca. Mam sprawdzać czy dany znak jest spacją, a następnie wszystkie wczesniejsze znaki od ostatniej spacji zapisywac do zmiennej pomocniczej i przekonwertowac do inta, a następnie wrzucić to do zmiennej? Mógłby ktoś pomóc? Będę bardzo wdzięczny. Chodzi o projekt z programowania strukturalnego, wymagany jest program konsolowy, z nim problemów żadnych bym nie miał, bo algorytm w konsoli mi działa(sprawdzałem). Ja zawsze jednak chciałem stworzyć program okienkowy, ale nie chciałem tego wyklikiwać, bo chcę dowiedzieć się jak takie programy działające na formach i przeciągające buttony itd działają, a bazują w zasadzie chyba na WinApi. Dlatego też postanowiłem się tego pouczyć, tak dla siebie.

Z góry dziękuję za pomoc. Proszę o jakieś wyjaśnienia, a nie zdawkowe odpowiedzi...

0

Chcialem to zrobic normalnie fstreamem, ale w programie wyskakuje mi błąd : Identifier "ifstream" is undefined, pomimo że dołączam wszystkie biblioteki.

#include <fstream>
0

Azarien wiem doskonale jak się korzysta z fstream, ale w aplikacji Win32 nie można tego użyć, więc jeśli nie masz nic do powiedzenia w sprawie rozwiązania mojego problemu to nie pisz ;) Prosiłem o wyjaśnienia, a Ty napisałeś jednego include'a, który nie wnosi nic nowego. W poście pisałem, że wiem jak korzystać ze strumieni i konsolowy program działa jak należy

0

Azarien wiem doskonale jak się korzysta z fstream, ale w aplikacji Win32 nie można tego użyć

A kto ci zakazał?

0

A kto ci zakazał?

A próbowałeś użyć fstreama w WinApi? Spróbuj i wtedy się dowiesz dlaczego nie można go użyć.
Ja nie wiem czy Wy sobie posty chcecie nabić czy co? Prosiłem o pomoc, a póki co jedynie pierwsza odpowiedz jest sensowna.

1

Hmmm... dziwne, bo ja bez problemów używam fstream razem z WinAPI32, MFC, czy tam VCL'em... weź się tak nie unoś, z tym doskonale to jednak nie tak doskonale...

Co do problemu, skoro masz wszystko jako c-string pobrane z pliku to możesz to rozbić np. używając strstream - łatwo i przyjemnie.

0

Tylko w tym wypadku jak przejsc po tablicy i oddzielic liczby od znaków białych, żeby w odpowiedniej kolejności trafiały do zmiennych?

Liczby od znaków białych możesz oddzielić za pomocą biblioteki cctype i odpowiedniego kodu.

0
oktiwek napisał(a)

Liczby od znaków białych możesz oddzielić za pomocą biblioteki cctype i odpowiedniego kodu.

A mógłbyś coś więcej o tym napisać? Pierwszy raz stykam się z tą biblioteką.

ifstream iplik; - wystarczy, że napiszę taką linijkę i już jak najadę myszką na "ifstream" wyświetla mi "identifier "ifstream" is undefined"...

#include <fstream>

oczywiście mam...

0

Ehhh... dokładnie, albo std::ifstream, albo using namespace std; - tyle krzyku o taką drobnostkę ;)

0
mbar254 napisał(a)

A kto ci zakazał?

A próbowałeś użyć fstreama w WinApi? Spróbuj i wtedy się dowiesz dlaczego nie można go użyć.
Ja nie wiem czy Wy sobie posty chcecie nabić czy co? Prosiłem o pomoc, a póki co jedynie pierwsza odpowiedz jest sensowna.

Wkurza mnie takie coś. Koleś nie zna podstaw a napina się i wykrzykuje. Człowieku - albo chcesz żeby ktoś ci pomógł, albo sobie odpuść. Nie ma żadnego powodu, zeby ifstream nie działało z winapi. I tak, używałem ale taka jest różnica że ja wiem jak go użyć. Powyżej już ci wyjaśniono więc nie będę się powtarzać.

0

byku_guzio dzięki za odpowiedz. Mialem using namespace std; , ale jak komentowałem niektóre biblioteki to przez przypadek wykomentowałem i to...

othello rozumiem Twoje wkurzenie, bo wyszło na to, że nic kompletnie nie wiem, a się bulwersuję. Tylko teraz jak chciałeś mnie opieprzyć to napisałeś kilka sensownych zdań, a tamta Twoja wypowiedź nie wnosiła zupełnie nic do tematu, a ja oczekiwałem pomocy.

0

hej, dopiero ucze się programować. czy ktoś by mi pomógł? chodzi mi o baze danych w excelu, chce żeby wpisując w pole tekstowe jakieś imie wyskakiwało mi tekst wczytywany z bazy danych. ktoś, coś wie?

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