Zaloguj się, aby obserwować  
Bartuc

Język C / C++ / C# / Java - pytania, problemy...

1979 postów w tym temacie

Dnia 09.12.2010 o 22:37, Piotrbov napisał:

Jak można wczytać z pliku jakąś liczbę? Trzeba korzystać z fgets''a i zrobić daną liczbę
jako string, czy da się to inaczej zrobić?


C++ pozwala na bezpośrednie wczytanie liczb z pliku, bez potrzeby bawienia się stringami itp.
Tu masz przykład na program który oblicza sumę liczb oddzielonych spacjami w pliku .txt.

#include <fstream>
using namespace std;

int main ()
{
ifstream F ("plik.txt");
if (F) // sprawdzenie czy strumień jest poprawny
{
double suma =0.0;
do
{
double x;
F >> x; // <-czytanie kolejnych liczb z pliku, najlepiej oddzielonych spacjami
if (F)
suma+=x;
}while(F); // upewnienie się że nie doszło do uszkodzenia pliku bądź nie doszliśmy do jego końca
}

return 0;
}


Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Radzę sobie z C++ całkiem nieźle, Turbo Pascal też mam ogarnięty. Ostatnio zacząłem się bawić w C++ Builder 6 (oprogramowanie legalne, zapewnia mi je uczelnia). Porobiłem sporo podstawowych programów, kalkulatory, stopery, delty itp. Teraz przez święta chcę zrobić jakąś prostą gierkę. Znacie jakieś dobre kursy? Nie chodzi mi tu o opisy funkcji itp. ale o coś co mi pokaże jak projektant gier powinien rozwiązywać problemy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Tak przy okazji ma ktoś gotowy program z kodem źródłowym do programu w stylu jednoosobowego ponga? Sterujesz platformom i odbijasz kulkę która się obija po ścianach?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 14.12.2010 o 17:06, ja33no napisał:

Radzę sobie z C++ całkiem nieźle, Turbo Pascal też mam ogarnięty. Ostatnio zacząłem się
bawić w C++ Builder 6 (oprogramowanie legalne, zapewnia mi je uczelnia). Porobiłem sporo
podstawowych programów, kalkulatory, stopery, delty itp. Teraz przez święta chcę zrobić
jakąś prostą gierkę. Znacie jakieś dobre kursy? Nie chodzi mi tu o opisy funkcji itp.
ale o coś co mi pokaże jak projektant gier powinien rozwiązywać problemy.

http://www.gamedev.pl/
Jeśli temat cię interesuje, gorąco polecam powyższą stronę. Zwłaszcza IMO genialny "Megatutorial" o języku C++. To tak naprawdę książka o programowaniu, której o dziwo, nikt nie wydał.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 22:13, Piotrbov napisał:

Jak można w języku C wpisać do danego pliku zero binarne?

Chodzi ci o to, czy można zapisać pojedynczy bit?
Odpowiedź brzmi - nie jest to możliwe. Musisz zapisać cały bajt. Jeśli potrzebujesz tylko jednego bitu, to po prostu odczytaj go potem z maską.

Jeśli chodzi ci ogólnie o zapis w trybie binarnym (jako alternatywę dla zapisu tekstowego), to po prostu otwierasz go funkcją
FILE *fopen(const char *path, const char *mode);
jako mode podajesz "wb", b oznacza tryb binarny. Potem zapisujesz to funkcją
size_t fwrite (const void *array, size_t size, size_t count, FILE *stream);
Czyli tworzysz sobie odpowiednią tablicę jednoelementową zawierającą odpowiedni wpis z zerem.
Potem zamykasz
int fclose(FILE *fp);

Jeśli nie chodzi o żadną z tych dwóch opcji, to proszę doprecyzuj pytanie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 22:24, Vel_Grozny napisał:

Jeśli nie chodzi o żadną z tych dwóch opcji, to proszę doprecyzuj pytanie.


O właśnie o coś w tym stylu chodzi, tylko zapomniałem o jednej rzeczy ( może dwóch ). Mam plik otwarty z mode''m r+, czy w tym modzie mogę to zrobić, czy muszę zamknąć i od razu otworzyć plik z mode''m wb?
A po drugie, to dodam że chodzi mi o to by wpisać do pliku znak "00" w formacie szesnastkowym.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 22:31, Piotrbov napisał:

O właśnie o coś w tym stylu chodzi, tylko zapomniałem o jednej rzeczy ( może dwóch ).
Mam plik otwarty z mode''m r+, czy w tym modzie mogę to zrobić, czy muszę zamknąć i od
razu otworzyć plik z mode''m wb?

r+ otwiera pliku zarówno do zapisu, jak i odczytu, ale w trybie tekstowym, nie binarnym.
Dawno nie korzystałem z File IO w C, więc posiłkuję się teraz wikipedią ("wiarygodne źródło", więc ostrożnie ;P)

Cytat. Lepiej przeczytaj, zanim pojawią sie bugi podczas korzystania z "r+" (lub "rb+")
When a file is opened with update mode ( ''+'' as the second or third character in the mode argument), both input and output may be performed on the associated stream. However, writes cannot be followed by reads without an intervening call to fflush or to a file positioning function (fseek, fsetpos, or rewind), and reads cannot be followed by writes without an intervening call to a file positioning function.

Dnia 15.12.2010 o 22:31, Piotrbov napisał:

A po drugie, to dodam że chodzi mi o to by wpisać do pliku znak "00" w formacie szesnastkowym.

Heh, dalej nie rozumiem. Jeśli mówimy o trybie binarnym, to rozważania na temat systemu są bezcelowo. Wszystkie dane są zapisywane w systemie binarnym, bez wyjątku. Nie można dokonać zapisu w trybie szesnastkowym. Te same dane możesz zaprezentować użytkownikowi w trybie dwójkowym, szesnastkowym lub dziesiętnym, a nawet dwudziesto-siódemkowym lub dowolnym innym. Wewnętrzna reprezentacja będzie ta sama.
Jeżeli zaś mówimy o trybie tekstowym.... Czyli jeśli chcesz po otwarciu pliku w notatniku mieć napis
"0x00", to wystarczy ci funkcja fprintf. Do drukowania unsigned int jako hexy, służy typ %x (zamiast zwyczajowego %d dla trybu dziesiętnego). fprintf działa dokładnie tak samo jako printf, z tym, że przyjmuje jako pierwszy argument wskaźnik do FILE. Jeśli chodzi ci o takie działanie, to tryb r+ wystarczy spokojnie.

Pamiętaj, że znak ''0'' i wartość 0 to nie to samo. Zakładam, że jednak będzie ci chodziło o tryb tekstowy, zważywszy na to, ze tak go czytasz (r+). Nie widzę sensu odczytywania pliku binarnego jako plik tekstowy, więc tryb "r+" powinien ci wystarczyć. Ale pamiętaj o cytacie, który zerżnąłem z wiki :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 22:48, Vel_Grozny napisał:

Cytat. Lepiej przeczytaj, zanim pojawią sie bugi podczas korzystania z "r+" (lub "rb+")
When a file is opened with update mode ( ''+'' as the second or third character in
the mode argument), both input and output may be performed on the associated stream.
However, writes cannot be followed by reads without an intervening call to fflush or
to a file positioning function (fseek, fsetpos, or rewind), and reads cannot be followed
by writes without an intervening call to a file positioning function.


To ja o tym wiem. Na pierwszą część projektu właśnie mi to r+ pasuje ( a co do wiedzy na temat C to korzystam ze strony http://cplusplus.com/ którą gorąco polecam )

Dnia 15.12.2010 o 22:48, Vel_Grozny napisał:

Jeżeli zaś mówimy o trybie tekstowym.... Czyli jeśli chcesz po otwarciu pliku w notatniku
mieć napis
"0x00",


Nie. Chcę, by po otwarciu danego pliku w edytorze szesnastkowym powstał nowy znak o wartości 00.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 22:55, Piotrbov napisał:

Nie. Chcę, by po otwarciu danego pliku w edytorze szesnastkowym powstał nowy znak o wartości
00.

No cóż... To być może jednak przyda się otwarcie tego w trybie binarnym. Ale możesz spróbować zrobić taki numer.
char c = 0; (BEZ apostrofów)
Kompilator to pewnie puści, a jak nie, spróbuj wersji poniżej.

int a = 0;
char c = (char)a;

Nie jestem pewien co się stanie po zapisie tego w trybie tekstowym do pliku. :) Ale możesz sam się przekonać. Duża szansa, że zadziała. Tylko martwiłbym się o późniejszy odczyt danych. Jak do środka jakiegoś łańcucha wskoczy ci to zero, będzie niewesoło. Ale to już kwestia sposobu, w jaki przetwarzasz plik.

Osobiście spróbowałbym trzymać się obsługi w trybie tekstowym.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 23:00, Vel_Grozny napisał:

Kompilator to pewnie puści, a jak nie, spróbuj wersji poniżej.


Kompilator puszcza, ale jak program dochodzi do tego miejsca do signal 11 wyskakuje.

Dnia 15.12.2010 o 23:00, Vel_Grozny napisał:

int a = 0;
char c = (char)a;


Też signal 11.

Dnia 15.12.2010 o 23:00, Vel_Grozny napisał:

Osobiście spróbowałbym trzymać się obsługi w trybie tekstowym.


Ja też, ale ja muszę mieć w tym moim programie coś co będzie pisało zera binarne, dla mnie to jest ważna sprawa.
Czy można np. zamknąć plik a później go otworzyć w modzie z b?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 23:11, Piotrbov napisał:

Ja też, ale ja muszę mieć w tym moim programie coś co będzie pisało zera binarne, dla
mnie to jest ważna sprawa.
Czy można np. zamknąć plik a później go otworzyć w modzie z b?

Nigdy nie próbowałem, ale nie widzę teoretycznych problemów. Zapisujemy pozycję, zamykamy, przewijamy i piszemy :)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 23:15, Vel_Grozny napisał:

Nigdy nie próbowałem, ale nie widzę teoretycznych problemów. Zapisujemy pozycję, zamykamy,
przewijamy i piszemy :)


A jak zapisać to w tym formacie, jak ma się to z modem b włączone?

Edit. Dobra ja spadam, lecę spać ;) Tak tylko dla informacji byś nie czekał na moją odpowiedź/

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 23:18, Piotrbov napisał:

A jak zapisać to w tym formacie, jak ma się to z modem b włączone?

char a = 0;
fwrite ((void *) &a, sizeof(char), 1, plik);

To będzie dobrze, przy założeniu, że sizeof(char) = 1. Chyba nigdy nie widziałem, żeby to nie było spełnione. Albo jak znowu będziesz miał "signal 11". On się pojawiał przy tej linijce char a = 0;? Czy po próbie zapisu czegoś takiego? Bo sam zapis 0 do char nie powinien powodować żadnych problemów.

Ale na wszelki wypadek, można zrobić coś... złego ;]

short a = 0;
fwrite ((void *) &a, 1, 1, plik);

Czyli wbić na sztywno rozmiar na 1 bajt. Ale cały a jest wyzerowany, więc nieważne, który bajt sobie z niego zczytamy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach
Dnia 15.12.2010 o 23:11, Piotrbov napisał:

> Osobiście spróbowałbym trzymać się obsługi w trybie tekstowym.
Ja też, ale ja muszę mieć w tym moim programie coś co będzie pisało zera binarne, dla
mnie to jest ważna sprawa.

Tryb tekstowy w ogóle odpada. Po pierwsze poszczególne znaki mogą być pod różnymi kompilatorami obcinane do 7 bitów reprezentacji (choć osobiście nigdy się z tym nie spotkałem), po drugie zamykając plik system (albo biblioteka w C) dodaje ostatni bajt znaku wartownika o wartości ctr-z (w systemach Unix/Linux jest to ctrl+d) - czyli znacznik końca pliku w trybie tekstowym. W trybie binarnym nie jest absolutnie nic dodawane.
Znacznik EOF jest ustawiany właśnie po trafieniu na znak o takiej wartości w trybie znakowym (jest to bajt o wartości zabronionej) a w trybie binarnym przez porównanie długości pliku zapisanej w pozycji katalogowej z pozycją odczytu/zapisu pliku (ustawianą przez seek/fseek).
Bez tego znacznika w trybie tekstowym programy traktujące pliki jako strumień odczytywałyby wszystkie bajty aż do końcówki ostatniej jednostki alokacji pliku (cluster) i oczywiście odczytywałyby stamtąd śmieci (np. fragmenty poprzednich plików lub dłuższą końcówkę poprzedniej wersji pliku).

Poza tym najwyraźniej nie załapałeś, że wszystkie liczby w komputerze łącznie z tymi, które jawnie podajesz jako cyfry arabskie (lub w formacie szesnastkowym) są przechowywane wyłącznie w postaci binarnej. Stąd konwersja do postaci szesnastkowej jest banalna, a do postaci binarnej wręcz trywialna. Konwersja rzeczywista występuje właśnie w takich funkcjach jak cała rodzina printf lub w itoa, która jest używana w funkcjach fputc, putc, putchar. Dlatego może się komuś wydawać, że w "programie" liczby przechowywane są w postaci dziesiętnej. W rzeczywistości już w czasie kompilacji liczby są zamieniane od razu na postać binarną (1, 2, 4 lub 8 bajtów). Tylko tekst w cudzysłowach jest przenoszony z pliku źródłowego do binarnego w postaci ciągów tych samych kodów znaków. A i to nie jest prawda w wypadku źródeł javy i kilku innych języków, które konwertują go na ciąg w UTF-8 lub przekodowują na co innego.

Dnia 15.12.2010 o 23:11, Piotrbov napisał:

Czy można np. zamknąć plik a później go otworzyć w modzie z b?

Można tak zrobić. Najlepiej byłoby jednak otwierać wyłącznie w trybie binarnym. Mieszanie trybami otwarcia jest przydatne głównie w programach, które chcą operować plikami tekstowo-binarnymi, czyli takimi w których początek jest czysto tekstowy i zakończony wartownikiem, a reszta jest binarna. Wiele programów głupieje przy takich plikach i traktuje je wyłącznie jako tekstowe, co może być celowe. Na przykład w ten sposób można przechowywać kod wirusów w plikach wyglądających na nieszkodliwe pliki tekstowe. (Oczywiście jakakolwiek edycja takich plików w zwykłych edytorach spowoduje zniszczenie części binarnej).

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Utwórz konto lub zaloguj się, aby skomentować

Musisz być użytkownikiem, aby dodać komentarz

Utwórz konto

Zarejestruj nowe konto na forum. To jest łatwe!


Zarejestruj nowe konto

Zaloguj się

Masz już konto? Zaloguj się.


Zaloguj się
Zaloguj się, aby obserwować