program zapisujacy tekst do pliku a typ integer

0

Pytanie moze nie jest nie wiem jak istotne ale mnie ciekawi takze wrzuce kod i szybko pod spodem opisze o co chodzi.

#include <stdio.h>
#include <stdlib.h>
 
int main (int argc, char *argv[])
{
   FILE *fp;
   int c;
   if (argc < 2) {
      fprintf (stderr, "Uzycie: %s nazwa_pliku\n", argv[0]);
      exit (-1);
   }
   fp = fopen (argv[1], "w");
   if (!fp) {
      fprintf (stderr, "Nie moge otworzyc pliku %s\n", argv[1]);
      exit (-1);
   }
   printf("Wcisnij Ctrl+D+Enter lub Ctrl+Z+Enter aby zakonczyc\n");
   while ( (c = fgetc(stdin)) != EOF) {
      fputc (c, stdout);
      fputc (c, fp);
   }
   fclose(fp);
   return 0;
}

Na poczatku zmiennej c jest nadany typ integer, ale do pliku ktory tworzy program mozemy zapisywac dowolne liczby, litery albo znaki, jak to mozliwe jesli zmienna ma typ int ?

0

Ech. A może zaczniesz się uczyć zamiast zadawać 100 pytań dziennie? Wyobraź sobie że każdy znak w komputerze ma pewną reprezentację liczbową. Musi, bo komputer potrafi operować tylko na liczbach. Dla komputer nie ma czegoś takiego jak "znak" czy "litera". Wszystko ma po prostu swój numer.

0

Ucze sie ucze, a pytan chyba od miesiaca nie zadawalem, wiem ze troche sporo dzis no ale trudno.Wiem ze komputer operuje tylko na liczbach ale np jesli powiedzmy damy typ int jakiejs zmiennej a potem chcemy w niej zapisac litere to jest juz blad a tutaj nie, dlatego to mnie ciekawi.

0

Ech. Bo wczytujesz teraz ZNAKI a nie liczby. getc() czyta po ZNAKU. Jak podasz mu 1234 to on tego nie wczyta jako liczby tylko jako 4 osobne znaki...

0

Aha, to problem bylby tylko gdybym probowal wczytac do tej zmiennej znaki/litery za pomoca scanf, rozumiem. (jesli nie to prosze poprawic ale mam nadzieje ze rozumiem : ) )

0

Ech. scanf z podanym parametrem określającym typ jest znów dość skomplikowaną funkcją (pamiętasz implementacje stringa? :P) która dokonuje konwersji ciągów znaków czytanych z klawiatury na zmienne odpowiedniego typu i sygnalizuje błędy jeśli taka konwersja nie jest możliwa.

0

Ehh. Dalej nie do konca lapie xd Ale np w c++, jesli tworze zmienna typu int a potem std::cin'em podam na wejscie znak/litere to bedzie to bledem, ale tutaj moge zapisywac znaki/litery do zmiennej typu int, czemu tam zle a tu dobrze ?

0

to sie nazywa rzutowanie. Rzutuje Ci z chara na inta (kompilator samoczynnie).

a to ze jak wczytujesz cinem i wyrzuca blad. To po prostu jest tak cin zaimplementowany zeby nie robic niejawnego rzutowania.

0

Bo operator>> dla strumienia cin jest BARDZO skomplikowaną funkcją. I tak jak scanf, ta funkcja stara się dokonać automatycznej konwersji wpisywanych danych do typu który podajesz jako argument. Scanf wymaga podania explicite typów parametrów przez %d czy %c, a tutaj jest jeszcze lepiej bo funkcja sama rozpoznaje sobie co zrobić na podstawie typu argumentu.

0

Zerknij sobie na tablicę ASCII: http://pl.wikipedia.org/wiki/ASCII jak widzisz masz tam kody dla znaków określane liczbami ( kolumna DEC ).
I takie liczby możesz sobie zapisywać do zmiennych typów char ( 1 bajt ) czy int ( u mnie 4 bajty ). Czyli jak chcesz zapisać literę "A" to możesz zapisać:

char clitera;
int ilitera;
litera = 'A';   // zostanie automatycznie zamienione przez kompilator na wartość 65
ilitera = 65;

W przypadku ilitera trzeba dokonać konwersji na typ char jak chcesz wydrukować na ekranie literę np. poprzez printf().

Pamiętaj, że char to 1 bajt więc można pomieścić liczby z zakresu -127 do +127 tak więc do przechowywania znaków ASCII nadaje się idealnie ;)
Tak więc nie ma tutaj żadnej "magii" :)

0

dobra wszystko jasne dziekuje ;d

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