ďťż

Ładny brzuch

Ogólnie moje pytania dotyczą spraw bardziej 'assemblerowych', jednak jeśli ktoś ma kod, to wolałbym C++;

1. Jaka jest wartość liczbowa znaku końca pliku(EOF). W końcu każdy znak ma odpowiadający kod ASCII ?
2. Dlaczego znak końca linii (/n) zajmuje 2 bajty ?
3. Czemu, jak do pliku binarnego(np *.com) chce wstawić spacje(liczba 32), to zawsze wychodzi mi kod poprzedzającego odstęp znaku ?
4. Gdzie jest zawarta informacja o rozszerzeniu pliku (zdążyłem już wygooglować że nie w nim samym)



1. http://www.google.pl...2...=Szukaj&lr= Dla mnie ten znak nie istnieje, bo i do czego mi się przyda?
2. Za '\n' zapisują się znaki 13 i 10, czyli powrót kursora na początek i nowa linia.
3. ?
4. W rejestrze: HKCR\.*.

3. W jaki sposób zapisujesz tą spację to do tego pliku?


Ogólnie moje pytania dotyczą spraw bardziej 'assemblerowych', jednak jeśli ktoś ma kod, to wolałbym C++;

1. Jaka jest wartość liczbowa znaku końca pliku(EOF). W końcu każdy znak ma odpowiadający kod ASCII ?
2. Dlaczego znak końca linii (/n) zajmuje 2 bajty ?
3. Czemu, jak do pliku binarnego(np *.com) chce wstawić spacje(liczba 32), to zawsze wychodzi mi kod poprzedzającego odstęp znaku ?
4. Gdzie jest zawarta informacja o rozszerzeniu pliku (zdążyłem już wygooglować że nie w nim samym)


1. pod windows napewno znak ASCII 26 (ale moze sie zdarzyc ze bedzie to tez inny znak), pod linuchem troche to inaczej wyglada, na teraz nie jestem w stanie tego Ci powiedziec :/
2. owszem 2 bajty (znaki ASCI 10 i 13) pod windowsem, ale juz w linuxie 1 bajt (chyba 13 o ile sie nie myle)



Jeżeli w C++ nie da się ios::binary przy otwieraniu strumienia, wtedy znak \n jest zapisywany jako \r\n , kombinacja \r\n odczytywana jako \n (w innych językach jest to na pewno podobnie). Jeśli dodasz ten znacznik, wówczas \n będzie po prostu \n.

Co do trzeciego: czy mógłbyś podać jaśniej, kiedy i co ci wychodzi?

Dzięki za dotychczasowe odpowiedzi a co do:


-------
Co do trzeciego: czy mógłbyś podać jaśniej, kiedy i co ci wychodzi?

To w pliku binarnym mam np.
97 98 99 100 101 // abcde
czyli 5 bajtów. Chce teraz zamienić 99 na spacje, to robię ios::binary i zapisuje na pozycji 2 liczbę 32, która normalnie powinna być tekstowo wyświetlana jako spacja (czy może tu się myle :huh: ). Ale nie - w pliku binarnym robi mi się
97 98 100 100 101 // abdde
Nie wiem, czy to błąd zapisu czy może odczytu ?
Użytkownik ToNieJa edytował ten post 28 październik 2006, 11:47
No więc ja może tutaj zadam swoje pytanie: aby spróbować pomóc ToNieJowi napisałem program. No i mam problem. Jest w nim fragment:
ofstream strum ("dane.dat", ios::out | ios::app | ios::binary); strum.seekp(liczba, ios::beg); strum << (unsigned char)dana; //strum.put((unsigned char)dana) też próbowałem dalej = false;
No i zawsze dopisuje się na końcu.
Liczba oraz dana to liczby int podane przez użytkownika
Pełny kod programu (jeśli ktoś chce):
#include "stdafx.h" #include <iostream> #include <fstream> #include <string> #include <vector> using namespace std; void inicjuj(); void zmien(); void odczytaj(); int _tmain(int argc, _TCHAR* argv[]) { cout << "Co chcesz zrobic? " << endl; bool dalej = false; do { cout << "1) Inicjuj plik danych\n" "2) Zmien dane\n" "3) Odczytaj dane\n" "0) Wyjdz\n"; char znak; cin >> znak; switch(znak) { case '1': inicjuj(); dalej = true; break; case '2': zmien(); dalej = true; break; case '3': odczytaj(); dalej = true; break; case '0': return 0; default: dalej = true; cout << "Bledna wartość\n"; break; } }while (dalej); system("PAUSE"); return 0; } void inicjuj() { vector<unsigned char> bajty; cout << "Podaj bajty do zapisu\nWpisz dowolną litere, aby zakonczyc\n"; bool dalej = true; for (int i = 1; dalej; i++) { cout << i << ") "; int liczba; unsigned char znak; cin >> znak; if (znak >= '0' && znak <= '9') { cin.unget(); //odłóż znak z powrotem cin >> liczba; if (liczba > 255){ cout << "Zla liczba!\n"; i--; continue; } bajty.push_back((char)liczba); } else break; } if (!bajty.size()) { cout << "Niepodano ani jednej liczby!\n"; return ; } ofstream strum; strum.open("dane.dat", ios::out | ios::trunc | ios::binary); if (!strum) { cout << "Błąd podczas otwierania pliku\n" << endl; return ; } strum.exceptions( ios::failbit ); try { for (unsigned int i = 0; i < bajty.size(); i++) strum << bajty[i]; } catch (...) { cout << "Błąd strumienia!\n"; } } void zmien() { bool dalej = false; do { cout << "Podaj numer bajtu: "; int liczba; cin >> liczba; ofstream strum ("dane.dat", ios::out | ios::app | ios::binary); if (!strum) { cout << "Błąd podczas otwierania pliku" << endl; return ; } strum.exceptions(ios::failbit); try { strum.seekp(liczba, ios::beg); if ( strum.eof() ) { cout << "Za duża wartosc!\n"; dalej = true; } else { cout << "Podaj liczbę do wpisania: "; int dana; cin >> dana; //strum << (unsigned char)dana; strum.put((unsigned char)dana); dalej = false; } } catch (...) { cout << "Blad!"; return; } }while (dalej); } void odczytaj() { ifstream strum ("dane.dat", ios::in | ios::binary); if (!strum) { cout << "Błąd podczas otwierania pliku" << endl; return ; } while (!strum.eof()) { unsigned char bajt; bajt = strum.get(); cout << (int)bajt << " "; } cout << endl; }


No więc ja może tutaj zadam swoje pytanie: aby spróbować pomóc ToNieJowi napisałem program. No i mam problem. Jest w nim fragment:
ofstream strum ("dane.dat", ios::out | ios::app | ios::binary); strum.seekp(liczba, ios::beg); strum << (unsigned char)dana; //strum.put((unsigned char)dana) też próbowałem dalej = false;
No i zawsze dopisuje się na końcu.
Liczba oraz dana to liczby int podane przez użytkownika


ios::app - to powoduje ze cokolwiek nie wpiszesz do pliku zawsze bedzie na koncu..
dawno sie nie bawilem tak na plikach, ale na dzien dzisiejszy bym zrobil to tak:
najpierw zczytac zawartosc, przy okazji modyfikujac strumien, do tablicy charow i potem otworzyc ten sam plik z ktorego sie zczytywalo kasujac jego zawratosc i zapisac to co w tablicy :) (wiem wiem troche takie "na okolo", ale nie bata zeby nie zadzialalo :P)

PS. nie patrzylem calego Twojego kodu lampak :P


ios::app - to powoduje ze cokolwiek nie wpiszesz do pliku zawsze bedzie na koncu..
A, dzięki. Pomagałem sobie Symfonią, zobaczyłem, że ate to dopisywanie na końcu zawartości, więc nie przeczytałem dokładnie o app, uznając, że to musi być na początku, a tu app to jest też na końcu, ale pliku...

dawno sie nie bawilem tak na plikach, ale na dzien dzisiejszy bym zrobil to tak:
najpierw zczytac zawartosc, przy okazji modyfikujac strumien, do tablicy charow i potem otworzyc ten sam plik z ktorego sie zczytywalo kasujac jego zawratosc i zapisac to co w tablicy :) (wiem wiem troche takie "na okolo", ale nie bata zeby nie zadzialalo :P)

Wiem, ale, jak już pisałem, chciałem spróbować pomóc ToNieJowi, a zdaje się, że on nie robi tego w ten sposób.

PS. nie patrzylem calego Twojego kodu lampak :P
Nie spodziewałem się, że ktoś go będzie czytał :) Zamieściłem tak na wszelki wypadek.

No dobra, tak więc na strumieniach w C++ nie da się tego zrobić. Bez app domniemane jest trunc, czyli kasowanie zawartości pliku, a z nim dopisujemy na końcu. Trzeba by zapisać coś do pliku używając tego samego strumienia i tylko wtedy seekp() by działało.

O, widze że topic się rozrasta :D
// Aha - edytowałem mój 2 post w tym temacie, dokładniej drugi code w tym poście

Mój sposób to poprostu:
ofstream bin(fn, ios::binary|ios::in); bin.seekp(pos); // pozycja w pliku bin.put(w); // znak bin.close();

No i właśnie gdy zmienna w ma wartość 32 to dzieje się to co już opisałem.
Idąc dalej czy ktoś wie czy tak rzeczywiście wygląda liczba -10 na bitach (w kodzie ZM) ?
1 0 0 0 1 0 1 0

To nie działa. Jeżeli nie ustawisz ios::app (wg Symfoni może być jeszcze ios::ate, ale moje testy tego nie potwierdzają) automatycznie ustawia się ios::trunc, czyli kasowanie starej zawartości pliku.

Co do liczby -10 w systemie binarnym: komputer nie zna liczb ujemnych. W zmiennych signed liczba zero to jakaś liczba w samym środku możliwych wartości. Po prostu wie, gdzie jest zero i na tym bazuje obliczenia (sprytne, nie?).

10001010(2) = 138(10)
[138+(-10)]*2 = 256
Czyli liczba -10 jest zapisana na jednym bajcie (typ signed char)

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • zsf.htw.pl
  •