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

0 głosów
622 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 Mentor (355,180 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 Mentor (355,180 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 Mentor (355,180 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 Mentor (355,180 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,040 p.)
i<=40, ma być mniejsze bądź równe

Podobne pytania

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

93,731 zapytań

142,668 odpowiedzi

323,286 komentarzy

63,290 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...