Nowe posty

xx Problem ze sterownikami. (5)
2024-04-13, 21:25:16
xx Instalacja xfce4 (2)
2024-04-13, 16:20:17
xx Serie kompilacji bez instalacji dla “emerge” w Gentoo (2)
2024-04-08, 18:40:04
xx Plasma 6 w Neonie ssie trochę mniej ... (17)
2024-04-05, 10:03:46
xx Problem z Linux Lite po instalacji (3)
2024-04-03, 14:23:40
xx Jak właczyć num locka przy starcie systemu debian 12? (12)
2024-04-02, 17:43:54
xx Brak dźwieku w systemie. (5)
2024-04-02, 16:13:41
xx Dystrybucja pod HP Omen (7)
2024-03-29, 11:33:05
xx [Poradnik] Wyszukiwanie Sterowników (2)
2024-03-27, 21:08:23
xx Ile pingwinów? (1)
2024-03-27, 08:59:24

Autor Wątek: fscanf i struktura  (Przeczytany 8251 razy)

goscccccccccccc

  • Gość
fscanf i struktura
« dnia: 2008-12-04, 19:36:28 »
Hej,

głupia sprawa, ale mam problem z wcytaniem danych do struktury za pomocą fscanf.

Mam sobie takie coś

#include 

struct Struktura {
   char napis[20];
   float liczby[3];
} Dane[15];

int main() {
   int i = 0;
   FILE *fp;
   fp=fopen("/katalog/plik", "r");
   while(feof(fp) == 0) {
      {
            fscanf(fp, "%s %f %f %f", Dane[i].napis, &Dane[i].liczby[0], &Dane[i].liczby[1], &Dane[i].liczby[2]);
             i++;
       }
   return 0;
}
plik wygląda tak :
napis 123 234 543
takinapis 542 234 123
innynapis 432 3 234
I program mi sie wykrzacza przy wykonywaniu fscanf. Debuger mówi tylko segmentation fault, co mi nie wiele mówi - z czasem się go nauczę, bo to jednak lepsze od wstawiania wyrazów w kod. Szukałem po sieci, ale cięzko znaleźć przykłady a to co znalazłem raczej mi mówi, że mój kod jest ok. http://www.java2s.com/Code/C/File/fscanffprintfexample.htm
Próbowałem bez amperzantów, ale też nie działa.  Przesunięcie apmperzantów za kropkę nie przechodzi przez kompilator gcc. Wolałbym zachować tą strukturę. Będę wdzięczny a pomoc.

Offline mateo86

  • Users
  • Guru
  • *****
  • Wiadomości: 647
    • Zobacz profil
fscanf i struktura
« Odpowiedź #1 dnia: 2008-12-04, 21:06:18 »
za pomocą scanf raczej nie wczytasz łańcucha znaków... Co najwyżej jeden znak
ze fscanf może być podobnie...

Spróbuj użyć innej funkcji, np. fgets
Z tym że będzie później musiał napisać jeszcze trochę kodu wykrywającego liczby.

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #2 dnia: 2008-12-04, 22:07:03 »
??? Przecież %s jest do wczytywania ciągu znaków do pierwszego białego znaku. Coś mylę?

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #3 dnia: 2008-12-04, 22:17:49 »
Aż sobie przetestowałem, bo wprowadziłeś mnie w niepewność.

#include 

char napis[111];

main(){
printf("wpisz cos\\n");
scanf("%s", &napis);
printf("Twoj napis to: %s", napis);
return 0;
}
a wyniki takiego programu
C:\\program.exe
output: wpisz cos
input: jakis
output: Twoj napis to: jakis

C:\\program.exe
output: wpisz cos
input: jakis napis
output: Twoj napis to: jakis
Ja problem upatruje raczej we właściwym odwołaniu się do elementów struktury, ale nie mogę na nic wpaść a eksperymenty nie przyniosły rozwiązania.

brograf

  • Gość
fscanf i struktura
« Odpowiedź #4 dnia: 2008-12-04, 22:54:51 »
A mi się Twój program zapętla :)

A http://ubuntuforums.org/showthread.php?t=144558 czytałeś? Tu jest odmiana z dynamicznym alokowaniem pamięci. Może się przyda.

A tu masz coś o nieszczęsnej funkcji feof: http://viable.pl/tutorial/106/ (apropos zapętlania)

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #5 dnia: 2008-12-04, 23:00:36 »
A jednak nie w fscanfie problem tylko w warunku pętli.

Coś takiego:
#include 



struct Struktura {
   char napis[20];
   float liczby[3];
} Dane[15];

main(){
int i= 0;
//printf("wpisz cos i 3 liczby: \\n");
FILE *fp;
fp=fopen("plik", "r");
while(Dane[i].napis != EOF) {
fscanf(fp ,"%s %f %f %f", &Dane[i].napis, &Dane[i].liczby[0], &Dane[i].liczby[1], &Dane[i].liczby[2]);
printf("Twoj napis to: %s a liczby to %f %f %f", Dane[i].napis, Dane[i].liczby[0], Dane[i].liczby[1], Dane[i].liczby[2]);
}
return 0;
}
Działa. Problem w tym, że pętla wykonuje się bez końca. Jakby ktoś mi coś podpowiedział to byłbym wdzięczny.

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #6 dnia: 2008-12-04, 23:06:32 »
Dzięki za linki. Oświeciły mnie sporo.
Coś takiego:
#include 



struct Struktura {
   char napis[20];
   float liczby[3];
} Dane[15];

main(){
int i= 0;
char buf[22] = "Garbage";
//printf("wpisz cos i 3 liczby: \\n");
FILE *fp;
fp=fopen("plik", "r");
while(fgets(buf, sizeof(buf), fp) != NULL) {
fscanf(fp ,"%s %f %f %f", &Dane[i].napis, &Dane[i].liczby[0], &Dane[i].liczby[1], &Dane[i].liczby[2]);
printf("Twoj napis to: %s a liczby to %f %f %f\\n", Dane[i].napis, Dane[i].liczby[0], Dane[i].liczby[1], Dane[i].liczby[2]);
}
return 0;
}
Niby działa poprawnie, ale nie wiem czemu nie wczytuje mi pierwszej linijki.

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #7 dnia: 2008-12-04, 23:10:03 »
eh.. początek jest zjadany przez bufor
#include 



struct Struktura {
   char napis[20];
   float liczby[3];
} Dane[15];

main(){
int i= 0;
char buf[2] = "sm"; //smietnik
//printf("wpisz cos i 3 liczby: \\n");
FILE *fp;
fp=fopen("plik", "r");
while(fgets(buf, sizeof(buf), fp) != NULL) {
fscanf(fp ,"%s %f %f %f", &Dane[i].napis, &Dane[i].liczby[0], &Dane[i].liczby[1], &Dane[i].liczby[2]);
printf("Twoj napis to: %s a liczby to %f %f %f\\n", Dane[i].napis, Dane[i].liczby[0], Dane[i].liczby[1], Dane[i].liczby[2]);
}
return 0;
}
zjada mi pierwsza literę :/

Offline mateo86

  • Users
  • Guru
  • *****
  • Wiadomości: 647
    • Zobacz profil
fscanf i struktura
« Odpowiedź #8 dnia: 2008-12-04, 23:39:11 »
Kurde... A czym kompilujesz?
Pamiętam kiedyś jak zaczynałem przygodę z c to miałem problem z tym, że scanf nie chciał wczytywać łańcuch znaków przez %s... Musiałem się z fgets meczyć...
Chyba jakiś zły kompilator miałem... :/

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #9 dnia: 2008-12-05, 10:14:02 »
minGW pod windows. Czasem też używam kolekcji kompilatorów z cygwina - ale w zasadzie jedno i drugie to to samo.

Podpowiem ci jeszcze, że jest taka niespodzianka u mnie, że %s nadal czeka na  znaki jeśli wciśniesz enter to program nadal przyjmuje znaki. Koniec jest po naciśnięciu spacji.

Swoją drogą muszę lepiej to sobie przetestować.

brograf

  • Gość
fscanf i struktura
« Odpowiedź #10 dnia: 2008-12-05, 22:31:28 »
jezeli chodzi o testowanie to sprawdz teksty dłuższe niż 20 znaków :)

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #11 dnia: 2008-12-05, 23:29:46 »
Sprawdziłem, działa. Gorzej gdy tekstu jest parę linijek, ale to chyba raczej związane z długością stringa. CO ciekawe bajer z enterem mi zniknął. Teraz działa mi normalnie.

Nadal nie mam jednak pomysłu na ten plik i na tą pętle.

goscccccccccccc

  • Gość
fscanf i struktura
« Odpowiedź #12 dnia: 2008-12-06, 00:27:02 »
A jednak sprawa okazała się banalna i nie potrzebne są nawet jakieś dynamiczne bajery.

#include 



struct Struktura {
   char napis[20];
   float liczby[3];
} Dane[15];

main(){
    int i =0;
    int j= 1;
    FILE *fp;
    fp=fopen("plik", "r");
    while(j != EOF) {

        j = fscanf(fp ,"%s %f %f %f", Dane[i].napis, &Dane[i].liczby[0], &Dane[i].liczby[1], &Dane[i].liczby[2]);
        printf("Twoj napis to: %s a liczby to %f %f %f\\n", Dane[i].napis, Dane[i].liczby[0], Dane[i].liczby[1], Dane[i].liczby[2]);
i++;
    }
    return 0;
}
Dzięki wielkie wszystkim ludziom dobrej woli ;-)