Pliki, C, C++, WinApi - dobór sposobu do problemu

0

Witam
Otóż piszę sobie program pod WinApi, nic znowu nadzwyczajnego.
Krótki opis: chcę napisać program, który ma dwa duże pola tekstowe, po otwarciu pliku z surowymi danymi, który wygląda mniej więcej tak: raw_data.txt jego zawartość będzie wyświetlona w jednym z pól tekstowych. W drugim polu tekstowym zostaną wyświetlone już skonwertowane dane: TC_BaseArmor.txt

Problem polega na sposobie jak to zrobić najlepiej. Jako że program piszę pod WinApi, próbowałem korzystać z funkcji WinApi, a mianowicie GetOpenFileName(...) oraz ReadFile(...) Oczywiście wszystko działa pięknie ładnie, tekst ładnie się wyświetla w textboxie, jednak cała zawartość pliku jest przechowywana w ciągu znakowym LPSTR, a żeby to skonwertować, trzeba by się nie lada natrudzić, korzystając nawet z udogodnień biblioteki string.h oraz funkcji takich jak find_first_of itp.

Dużo łatwiej jest dokonać konwersji z użyciem starych poczciwych funkcji z C: fscanf. Jak widać w pliku z surowymi danymi, każda osobna wartość jest oddzielona tabulacją, dlatego odczytanie nawet 15 różnych danych z jednej linijki pliku to prosta sprawa. Przykładowo chcę odczytać 4 zmienne i zapisać w nowym pliku w nowej formie:

fscanf(fp_in, "%s %s %d %d", text1, text2, &a, &b); //odczyt
fprintf(fp_out, "imie %s\ntyp %s\nzycie %d\nmana %d", text1, text2, a, b); //zapis

Jak widać w tym przypadku nie jest to takie trudne i złożone, nawet gdy danych będzie więcej. (dane w pliku raw_data.txt to kilkanaście linijek o takiej samej strukturze).

Tylko problem polega na tym, jak pogodzić to z WinApi. Myślałem, aby plik otwierać z użyciem dialogboxa GetOpenFileName(...), a po wyłuskaniu z niego ścieżki do pliku, dalej pojechać jak w zwykłym C, czyli:

FILE *fp;
fp = fopen( szFileName, "r");
fscanf(...); //itd

Tylko tutaj pojawiają się kolejne problemy, ponieważ konwersja będzie się odbywała na poziomie plików (nic nie będzie wyświetlane w textboxie, to by było jak w programiku konsolowym), więc też trzeba by było znowu jakoś te skonwertowane dane wrzucić oprócz do pliku także do textboxa2. Tylko tutaj znowu zaczyna się inny problem, bo aby tekst był poprawnie wyświetlony w textboxie, nowa linia musi być opatrzona znakami \r\n. Gdy dane zapisuje do pliku, wystarczy tylko \n, gdy do pliku właduje \r\n mam o jednego 'entera' za dużo w pliku wyjściowym.

Mam nadzieję że nie zamotałem za bardzo, i w miarę da się zrozumiec o co mi chodzi :)
Z góry dziękuję za wszelką pomoc, pozdrawiam.

0

uzywajac fscanf nie potrzebujesz zajmowac pamieci, wiec nie masz potrzeby deklarowania i alokowania bufora, a dane sa obrabiane od razu.

0

Tak, tylko chciałbym też odczytane i skonwertowane dane wyświetlić w textboxach, a do tego już jest potrzebny jakiś bufor. Chyba będę musiał jakoś to zrobić na dwa razy. tzn raz odczytać plik fscanf i od razu konwertować, a drugi raz odczytać cały plik do bufora i wyrzucić na textboxa. Tylko jeszcze się muszę zastanowić jak wyświetlić w drugim textboxie skonwertowane dane, tak żeby to zrobić w miarę ... hmm ładnie.

EDIT: Pomyślałem sobie, że może mógłbym to zrobić tak: otwieranie pliku z surowymi danymi zrobione jak w opisie powyżej. Po skonwertowaniu danych i zapisaniu ich do pliku wyjściowego, ten świeżo zapisany plik byłby wczytywany do bufora i następnie do textboxa2 (chodzi o to, abym w textboxach miał podgląd efektów wyjściowych). Oczywiście najlepiej byłoby, robić wszystkie operacje na ciągu znakowym (buforze), jednak chyba nie da się tak łatwo wyłuskiwać danych ze 'stringa' jak z pliku funkcją fscanf :(

W zasadzie mój problem nie polega na tym, że nie wiem jak to zrobić, tylko jak to zrobić, aby to było w miarę ładnie i 'poprawnie', tak jak np wiadomo że używanie instrukcji goto nie należy do najlepszych rozwiązań.

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