• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program zapisuje dziwne znaki do pliku. Język C.

Object Storage Arubacloud
0 głosów
255 wizyt
pytanie zadane 12 lipca 2019 w C i C++ przez wieczor9 Początkujący (370 p.)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    int i, stream;
    for(i=20; i<40; i++)
        {
            if(i%2==0)
                {
                    stream = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
                    char *x;
                    *x = i;
                    write(stream, &x, 1024);

                    close(stream);
                }
        }
    return 0;
}

 

1 odpowiedź

0 głosów
odpowiedź 12 lipca 2019 przez adrian17 Ekspert (344,860 p.)

Um... to nie ma sensu.

char *x;

OK, masz wskaźnik na znak(i), niezainicjalizowany...

*x = i;

Do wartości pod adresem x (który nie ma żadnej wartości) przypisujesz inta (przy okazji zmniejszasz też inta do chara)

write(stream, &x, 1024);

Następnie piszesz 1024 bajty pod adresem &x, czyli bajty x'a (wciąż niezainicjalizowanego) i reszta kompletnie losowa.

Co... chciałeś żeby ten kod zrobił?

komentarz 12 lipca 2019 przez wieczor9 Początkujący (370 p.)
Chce aby ten koda zapisywal wartosci od 20 do 40 podzielne przez 2. Za pomocą operacji niebuforowanych. Nie wiem kompletnie jak sie za to zabrac.
komentarz 12 lipca 2019 przez adrian17 Ekspert (344,860 p.)
Chcesz wypisać jej tekstową reprezentację (a nie binarnie)?

Zrób mały lokalny bufor na tekstową reprezentację (jakieś char text[32]), sformatuj do niego liczbę używając sprintf(), wypisz ten bufor write()m.
komentarz 12 lipca 2019 przez wieczor9 Początkujący (370 p.)
Tak aby po otwarciu pliku byly one normlanie wyswietlone
komentarz 12 lipca 2019 przez adrian17 Ekspert (344,860 p.)
No to tak jak napisałem :)
komentarz 12 lipca 2019 przez wieczor9 Początkujący (370 p.)
int main(int argc, char* argv[])
{
    int i, stream;
    char text[10];
    for(i=20; i<40; i++)
        {
            if(i%2==0)
                {
                    stream = open(argv[1], O_WRONLY | O_CREAT | O_TRUNC, 0644);
                    
                    int x = sprintf(text, "%d\n", i);
                    write(stream, &x, 10);
 
                    close(stream);
                }
        }
    return 0;
}

Takie cos zoriblem i nadal wywala mi jakies znaki typ C^%&@

komentarz 12 lipca 2019 przez wieczor9 Początkujący (370 p.)

@adrian17, móglbyś podac przykladowy kod ?

 

komentarz 12 lipca 2019 przez adrian17 Ekspert (344,860 p.)
Bo wciąż robisz bez sensu.

sprintf() wrzuca tekst do bufora text. Po co próbujesz write()ować inta, który ani trochę nie wygląda jak tekst?

sprintf() zwraca liczbę znaków w końcowym tekście. Więc AFAIK wystarczy zrobić write(stream, text, x);
komentarz 12 lipca 2019 przez wieczor9 Początkujący (370 p.)
@adrian17, działa lecz w pliku znajduje sie tylko 38
komentarz 12 lipca 2019 przez tkz Nałogowiec (42,000 p.)
i<=40, ma być mniejsze bądź równe

Podobne pytania

0 głosów
1 odpowiedź 956 wizyt
pytanie zadane 11 kwietnia 2019 w C# przez abcd Początkujący (290 p.)
0 głosów
2 odpowiedzi 172 wizyt
pytanie zadane 10 czerwca 2015 w C i C++ przez cartel13 Nowicjusz (160 p.)
0 głosów
1 odpowiedź 230 wizyt

92,547 zapytań

141,389 odpowiedzi

319,509 komentarzy

61,931 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...