• 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.

VPS Starter Arubacloud
0 głosów
253 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,100 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,100 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,100 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,100 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ź 910 wizyt
pytanie zadane 11 kwietnia 2019 w C# przez abcd Początkujący (290 p.)
0 głosów
2 odpowiedzi 171 wizyt
pytanie zadane 10 czerwca 2015 w C i C++ przez cartel13 Nowicjusz (160 p.)
0 głosów
1 odpowiedź 222 wizyt

92,451 zapytań

141,261 odpowiedzi

319,073 komentarzy

61,853 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...