Problem z formatowaniem w fscanf(wczytywanie naraz kilku łańcuchow znaków z pliku)

0

Problem polega na tym, że mam strukturę, w programie mam wskaźnik na tablice tych struktur. wysypuje mi się, gdy próbuje użyć fscanfa(zaznaczę w kodzie w którym miejscu)
plik tekstowy wyglada mniej wiecej tak:
3
1 adam abacki 222111222
2 robert babacki 444333666
3 Franek cabacki 555333111

//deklaracja nagłówków

struct osoba{
 int nr; 
 char imie[20];
 char nazwisko[30];
 unsigned long int numer;
};

int main(){

FILE *plik = fopen("plik.txt","a+");
rewind(plik);
int ile;
fscanf(plik,"%d",&ile); //w pierwszej linijce pliku tekstowego mam ilosc rekordow, nastene to rekordy.
osoba *wsk = new osoba[ile];

for (int i=0;i<ile;i++)
    fscanf("%d %s %s %uld",(wsk+i)->nr,(wsk+i)->imie,(wsk+i)->nazwisko,(wsk+i)->numer); //tu wyskakuje mi blad, ze nie mozna zapisac do komorki pamieci o jakims 
//adresie bo nie mam do niej dostepu. 


Jak zrobic, zeby poprawnie mi czytal ten plik i zapisywał jak trzeba? Z góry dzięki za pomoc:)

0

Twój kod się nawet nie kompiluje.

#include <cstdio>
#include <cstring>

struct osoba{
 int nr;
 char imie[20];
 char nazwisko[30];
 unsigned long int numer;
};

int main(){

FILE *plik = fopen("plik.txt","a+");
rewind(plik);
int ile;
fscanf(plik,"%d",&ile); 
osoba *wsk = new osoba[ile];

for (int i=0;i<ile;i++)
         // brakowało wskaźnika na plik     |    fscanf przyjmuje adres obiektu, a nie sam obiekt
    fscanf(plik, "%d %s %s %uld", &(wsk+i)->nr,&(wsk+i)->imie,&(wsk+i)->nazwisko,&(wsk+i)->numer);

for (int i=0;i<ile;i++)
    printf("%d %s %s %uld\n", (wsk+i)->nr,&(wsk+i)->imie,&(wsk+i)->nazwisko,&(wsk+i)->numer);


//...
}

Komentarz w kodzie :)

0

fscanf(TUTAJ CZEGOŚ BRAKUJE!, "%d %s %s %uld",(wsk+i)->nr,(wsk+i)->imie,(wsk+i)->nazwisko,(wsk+i)->numer);

0
AdamPL napisał(a)

fscanf(TUTAJ CZEGOŚ BRAKUJE!, "%d %s %s %uld",(wsk+i)->nr,(wsk+i)->imie,(wsk+i)->nazwisko,(wsk+i)->numer);

Nie tylko tutaj.

0

próbowałem dodać referencję, ale visual mi pokazywał błąd, poza tym wsk jest wskaźnikiem więc chyba bez referencji. chodzi mi o to, czy z pliku wczyta mi do białego znaku,przeskoczy o spację, wczyta string do spacji i kolejny do spacji apozniej tego long inta. Jak pisałem to program się kompilował, odpalał(ogólnieprojektmam podzielony na 3 pliki, osobny na deklaracje, na prototypy i na maina z wywołaniami, kod wrzuciem poglądowo, chcę wiedzeć tylko czemu przy próbie wczytania tego z pliku występuje błąd PROCESORA, że próbuję się dostać do adresu pamięci, która jest niedostępna dla programu, reszta projektu śmiga jak trzeba:) problem jest jedynie z tym scanfem(P.S.wiem ze fscanf przyjmuje dodatkowo pointer do pliku, z rozpedu go nie napisałem, prosze o wybaczenie.)

Alfredo napisał(a)

Twój kod się nawet nie kompiluje.

fscanf(plik, "%d %s %s %uld", &(wsk+i)->nr,&(wsk+i)->imie,&(wsk+i)->nazwisko,&(wsk+i)->numer);
0
gruch napisał(a)

próbowałem dodać referencję, ale visual mi pokazywał błąd

Nigdzie w tym kodzie nie masz referencji, strzelaj dalej.

Tu masz POPRAWNY kod.

#include <cstdio>
#include <cstring>

struct osoba{
 int nr;
 char imie[20];
 char nazwisko[30];
 unsigned long int numer;
};

int main(){

FILE *plik = fopen("plik.txt","a+");
rewind(plik);
int ile;
fscanf(plik,"%d",&ile);
osoba *wsk = new osoba[ile];

for (int i=0;i<ile;i++)
         // brakowało wskaźnika na plik     |    fscanf przyjmuje adres obiektu, a nie sam obiekt
    fscanf(plik, "%d %s %s %uld", &(wsk+i)->nr,&(wsk+i)->imie,&(wsk+i)->nazwisko,&(wsk+i)->numer);

for (int i=0;i<ile;i++)
    printf("%d %s %s %uld\n", (wsk+i)->nr,(wsk+i)->imie,(wsk+i)->nazwisko,(wsk+i)->numer);


//...
}

Pamiętaj, że w katalogu z programem musisz mieć plik plik.txt!
W przeciwnym wypadku dostaniesz:

terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Przerwane

Tu masz warningi:

g++ main.cpp -Wall --pedantic
main.cpp: In function ‘int main()’:
main.cpp:21:97: warning: format ‘%s’ expects type ‘char*’, but argument 4 has type ‘char (*)[20]’
main.cpp:21:97: warning: format ‘%s’ expects type ‘char*’, but argument 5 has type ‘char (*)[30]’
main.cpp:21:97: warning: format ‘%u’ expects type ‘unsigned int*’, but argument 6 has type ‘long unsigned int*’
main.cpp:24:89: warning: format ‘%u’ expects type ‘unsigned int’, but argument 5 has type ‘long unsigned int’
0

Dzieki bardzo:) O pliku też pamiętam, parametr a+ tworzy plik jak go nie ma ;) Gorzej w tym wypadku, że jest pusty. Zaraz postaram się to przekompilować i zobaczyć czy śmiga;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1