Otwieranie pliku do odczytu i zapisu hex

0

Witam i proszę o pomoc.

Jestem (bardzo) początkującym programistą. Mam 2 prośby:

  1. Czy mógłby mi ktoś jasno (najlepiej przykładem) pokazać, jak otworzyć plik, odczytywać z niego w hex'ie i tekstowo, oraz zapisywać z powrotem do niego zarówno wartościami hex jak i zwykłym tekstem?
  2. Jak korzystać z tablicy znaków? (chodzi mi o to, gdy tekst w pliku jest zapisany inną tablicą znaków niż ASCII)

Bardzo proszę o pomoc i z góry dziękuję.
Colly colly@interia.pl

To znowu ja :)

Zapomniałem dodać, że chodzi mi o C++

0

Witam i proszę o pomoc.

Jestem (bardzo) początkującym programistą. Mam 2 prośby:

  1. Czy mógłby mi ktoś jasno (najlepiej przykładem) pokazać, jak otworzyć plik, odczytywać z niego w hex'ie i tekstowo, oraz zapisywać z powrotem do niego zarówno wartościami hex jak i zwykłym tekstem?

to zalezy od trybu otwarcia pliku. Albo otwierasz jako tekstowy albo binarny. np.

FILE *wej=fopen(plik,"r");
  • otwiera w trybie tekstowym
FILE *wej=fopen(plik,"rb");
  • otwiera w trybie binranym
  1. Jak korzystać z tablicy znaków? (chodzi mi o to, gdy tekst w pliku jest zapisany inną tablicą znaków niż ASCII)

Jezeli tablica inna niz ASCII to jaka???

0

Skoro chcesz odczytywac dowolne dane z pliku to musisz go otworzyc w trybie binarnym (b);

1

prawie offtopic, odpowiem ci w C a nie C++, moze ktos przetlumaczy moj post ;>
ew uzyj polecen tych do obslugi plikow w C++, ja tak robilem, imho sa wygodniejsze ;>

  1. nie hexa, tylko binarnie ;> (chyba ze nie zalapalem o co ci chodzi)

  2. tak naprawde roznica jest tylko w zakonczeniu linii miedzy tymi dwoma trybami, to jest:
    tekstowy spodziewa sie ujrzec \r\n, i robi z tego podczas odczytu \n (tj do bufora \r nie dociera)
    binarny natomiast wrzuca i \r do buforka
    ofc ta roznica dotyczy tylko polecen umozliwiajacych zapis/odczyt danych tekstowo, na reszte CHYBA nie wplywa
    OFC pod linuxem nie ma \r\n, jest \n, wiec NIE MA roznicy miedzy trybem binarnym a tekstowym, wiec mozna pisac i fopen( "asdf", "rb" ) jak i fopen( "asdf", "r" )... ofc na windzie jest roznica, wiec jest to jeden z najczesciej szukanych/robionych bugow przy portowaniu programow z linuxa na winde ;p

  3. przyklady

zalozmy ze mamy

int asdf[ ] = { 12, 13, 54, 23, 67, 12 },
     sasdf = sizeof( asdf ) / sizeof( int );

(zapis odbywa sie w formacie: najpierw ilosc elementow, potem elementy)
k.. przykladowy zapis danych tekstowo:

int main( void )
{
  FILE *f; int i;
  f = fopen( "asdf.txt", "w" );
  fprintf( f, "%i\\n", sasdf );
  for( i = 0; i < sasdf; i++ ) fprintf( f, "%i\\n", asdf[ i ] );
  fclose( f );
  return 0;
}

teraz odczyt

int main(void )
{
  FILE *f; int i;
  f = fopen( "asdf.txt", "r" );
  fscanf( f, "%i\\n", &sasdf );
  for( i = 0; i < sasdf; i++ ) fscanf( f, "%i\\n", &asdf[ i ] );
  fclose( f );
  return 0;
}

a teraz binarnie, najpierw zapis

int main( void )
{
  FILE *f;
  f = fopen( "asdf.bin", "wb" );
  fwrite( &sasdf, sizeof( int ), 1, f );
  fwrite( asdf, sizeof( int ), sasdf, f );
  fclose( f );
  return 0;
}

i odczyt

int main( void )
{
  FILE *f;
  f = fopen( "asdf.bin", "rb" );
  fread( &sasdf, sizeof( int ), 1, f );
  fread( asdf, sizeof( int ), sasdf, f );
  fclose( f );
  return 0;
}

podsumowujac:
do zapisu/odczytu tekstowego uzywa sie:
fprintf( plik, "format", zmienne, zmienne.... );
fputs( "tekkst", plik );
fscanf( plik, "format", adres_zminnej, adres_zmiennej... );
fgets( buffor, wielkosc, plik );
i jeszcze fputc/fgetc
a do binarnych
fwrite( adres_rzeczy_do_zapisania, wielkosc_jednego_elementu, ilosc_elementow, plik );
fread( paramatry identyczne jak wyzej ;>)
do otarcia pliku sluzy fopen, do zamkniecia fclose
poza tym jeszcze zobacz sobie w manie/helpie fseek, ftell etc ;>

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