• 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
77 wizyt
pytanie zadane 12 lipca w C i C++ przez wieczor9 Początkujący (280 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 przez adrian17 Mędrzec (195,000 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 przez wieczor9 Początkujący (280 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 przez adrian17 Mędrzec (195,000 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 przez wieczor9 Początkujący (280 p.)
Tak aby po otwarciu pliku byly one normlanie wyswietlone
komentarz 12 lipca przez adrian17 Mędrzec (195,000 p.)
No to tak jak napisałem :)
komentarz 12 lipca przez wieczor9 Początkujący (280 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 przez wieczor9 Początkujący (280 p.)

@adrian17, móglbyś podac przykladowy kod ?

 

komentarz 12 lipca przez adrian17 Mędrzec (195,000 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 przez wieczor9 Początkujący (280 p.)
@adrian17, działa lecz w pliku znajduje sie tylko 38
komentarz 12 lipca przez tkz Gaduła (3,820 p.)
i<=40, ma być mniejsze bądź równe

Podobne pytania

0 głosów
1 odpowiedź 57 wizyt
0 głosów
1 odpowiedź 105 wizyt
0 głosów
1 odpowiedź 70 wizyt
Porady nie od parady
Komentarze do pytań nie służą do odpowiadania, od tego jest wydzielona sekcja odpowiedzi. Funkcją komentarzy jest natomiast możliwość uzyskania dodatkowych informacji na temat samego posta.Komentarze

65,794 zapytań

112,440 odpowiedzi

237,547 komentarzy

46,729 pasjonatów

Przeglądających: 232
Pasjonatów: 10 Gości: 222

Motyw:

Akcja Pajacyk

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

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...