12. januar 2005 - 15:17
Der er
44 kommentarer og 3 løsninger
Fjerne uønsket "støj" i printf-sætninger
Hej igen.. Nu har jeg siddet HELE dagen og bøvlet med det her l*** og jeg kan simpelthen ikke få det til at virke :I Jeg har en struct, som jeg skriver data ind i og gemmer ned i en fil. Det virker sådan set fint nok! I structen er name og gade, defineret som char name[255] og char gade[255] Problemet kommer, når jeg skal skrive dataen ud igen. Mine printfsætninger ser sådan ud; printf("Medlemsinfo:\n"); printf("\tNavn = %c\n", medlemmer->name); printf("\tGade = %s\n", medlemmer->gade); Men når jeg skriver ud, så skriver den 255 tegn og ikke kun det den skal skrive (altså navnet og gaden) :| Er der nogen måde at filtrere på, så man f.eks. fjerner alle "Í" tegn, inden den skriver det ud? Jeg håber, jeg har gjort mig selv forståelig, ellers må i endelig sige til :)
Annonceindlæg fra Kingston Technology
12. januar 2005 - 15:23
#1
Hvis det er til nogen nytte, så kan jeg nævne, at det er hexværdien CD, der ikke må forekomme.
12. januar 2005 - 15:26
#2
du mangler nul terminering på dine strenge og i navn printf skal %c ændres til %s
12. januar 2005 - 15:29
#3
Ah ja, der skal naturligvis stå %s :) Har lige leget lidt med det. Men hva mener du med, at jeg mangler nul terminering? Hvor skal det gøres?
12. januar 2005 - 15:32
#4
kommer an på hvordan du putter data'erne i stregene. hvis du kort modificer koden til: medlemmer->name[5] = '\0'; medlemmer->gade[5] = '\0'; printf("\tNavn = %c\n", medlemmer->name); printf("\tGade = %s\n", medlemmer->gade); vil du sikkert se at den kun printer 6 karakter for navn og gade.
12. januar 2005 - 15:32
#5
5 karakter :)
12. januar 2005 - 15:36
#6
hmm ja, det er jo faktisk logisk nok :) printf("Indtast navn: \n"); gets(medlemmer->name); Sådan indtaster jeg.. skal man så evt lave printf("Indtast navn: \n"); strlen(gets(medlemmer->name); Og så sætte strlen = en variabel, som man så kan smide ind i medlemmer->name[n] ='\0' f.eks.?
12. januar 2005 - 18:14
#7
Nej. Fordi strlen returnerer selv afstanden til første nul byte. Men gets burde selv sætte den nul byte ind. Så jeg forstår ikke helt hvorfor du ikke har den.
12. januar 2005 - 23:22
#8
Nej det er lidt underligt.. kan det ha noget at gøre med at jeg allokerer plads i hukommelsen?
13. januar 2005 - 06:02
#9
Det er ikke din udskrivning problemer ligger i, men enten din indlæsning - eller hvad du ellers gør med data, inden udskrivningen. Derfor bliver du nødt til at vise denne kode - eller også vil det være rent gætværk at prøve at gætte, hvad du gør galt. Det er sikkert fordi at du har fokuseret på udskrivningen, at du har prøvet næsten alt, men ikke kan få l***** til at virke..
13. januar 2005 - 08:48
#10
Det kan være :) Som sagt, så har jeg defineret structen således; struct medlemmer { char name[255]; char gade[255]; char post[8]; char by[255]; char tlf[20]; char mobil[20]; char email[255]; int number; }; Når jeg skal skrive ind i structen, gør jeg det således; printf("Indtast navn: \n"); gets(medlemmer->name); Og så fremdeles. Spørgsmålet er om det er når jeg skriver ned i filen og henter det ud fra filen igen, problemet opstår? Sådan her skriver jeg ned i filen; fp = fopen("c:\\tekstfil.txt", "a"); fwrite(medlemmer, sizeof(struct medlemmer), 1, fp); fclose(fp); Og sådan her skriver jeg det ud fp = fopen("c:\\yeah666.txt", "r"); while( fread(medlemmer, sizeof(struct medlemmer), 1, fp) ==1 ) { n++; } fclose(fp); for(j = 0; j < n; j++) { printf("Medlemsinfo:\n"); printf("\tNavn = %s\n", medlemmer[j].name); Og så videre.. :) Det gør at den skriver alle medlemmer ud, men ja.. skærmen bliver fyldt med underlige tegn :( Jeg skal nok hæve pointene, hvis jeg ellers kan hitte ud af det :D
13. januar 2005 - 08:52
#11
Det skal måske lige nævnes, at hvis jeg skriver medlemmer->name ud, så ser det fint ud. Det er først når jeg skriver medlemmer[j].name ud, at det går galt.. men det bliver jeg jo nødt til, for at skrive alt indhold af arrayet ud :(
13. januar 2005 - 08:58
#12
Hov, der skal naturligvis stå det samme filnavn :) Det gør der nu også i programmet.
13. januar 2005 - 09:00
#13
Prøv lige og erstat de fread kald med nogle fgets kald !
13. januar 2005 - 09:00
#14
som hovedregel: tekst linier => fgets binære data => fread
13. januar 2005 - 09:01
#15
vrøvl - din struct er jo netop binære data - sorry - glem det
13. januar 2005 - 09:03
#16
du skal nopk skrive filerne i binary mode med fread. fp = fopen("c:\\tekstfil.txt", "ab"); fwrite(medlemmer, sizeof(struct medlemmer), 1, fp);
13. januar 2005 - 09:03
#17
Men hvordan er variablem medlemme erklæret ? (ikke det samme som hvordan typen medlemmer er erklæret)
13. januar 2005 - 09:03
#18
while( fgets(&*medlemmer, sizeof(medlemmer[n]), 1, fp) ==1 ) < hvis jeg gør det sådan der, så går programmet ned :/
13. januar 2005 - 09:03
#19
fp = fopen("c:\\yeah666.txt", "rb");
13. januar 2005 - 09:04
#20
Jeg tror ikke helt jeg er med Arne. Jeg erklærer vel kun variablerne én gang, og det er inde i structen, ikke? chries > det er forsøgt :/
13. januar 2005 - 09:05
#21
du skal nok også læse og skrive til og fra samme fil ? yeah666.txt / tekstfil.txt ?
13. januar 2005 - 09:06
#22
Hvis jeg bruger "ab" og "rb", skriver den følgende ud; Navn = Gade = ===5 Postnummer = ===5 Hvor 5 er det data jeg indtastede sidst.. :/
13. januar 2005 - 09:06
#23
struct medlemmer { ... }; er klærer en type ikke en variabel. Hvordan er variablem medlemmer erklæret ?
13. januar 2005 - 09:07
#24
Det gør jeg også, havde bare lige leget lidt :)
13. januar 2005 - 09:07
#25
struct medlemmer *medlemmer = (struct medlemmer*)malloc(sizeof(struct medlemmer)); Den du tænker på Arne?
13. januar 2005 - 09:09
#26
Ja. Jeg forstår ikke helt hvorfor du læse alle medlemmerne ind i samme variabel og udskriver hvad der er i buffer efter sidste foejlede kald n gange.
13. januar 2005 - 09:10
#27
Hvis du har ændret i structen, så huske at slette alle gamle records i filen.
13. januar 2005 - 09:11
#28
Nææe.. det kan du ha ret i.. Måske man skulle starte helt forfra med det program her :I Synes det bliver mere og mere uoverskueligt heh
13. januar 2005 - 09:59
#29
Lige et helt generelt spørgsmål. Hvis man har en struct og man vil printe alt indholdet ud, så ville det mest oplagte være at gøre det via struct[n].variabel ikke? Hvordan gør man, hvis man skal bruge struct->variabel?
13. januar 2005 - 10:07
#30
var.felt hvis du har en struct var->felt hvis du har en pointer til struct var[i].felt hvis du har en pointer til mange struct eller et array af struct
13. januar 2005 - 10:11
#31
Jamen, det er jeg godt med på ved [n] kan man jo tælle op, så den printer alle medlemmer ud. Det kan jeg ikke lige lure, hvordan man gør med ->
13. januar 2005 - 10:45
#32
Det bedste er ikke at gøre det ! :-) men ellers: (var+i)->felt hvis du har en pointer til mange struct
13. januar 2005 - 10:49
#33
Ah ja, det var en mulighed :) Nu må jeg se.. jeg slettede al koden og startede forfra. Jeg gi'r lige hægtede lister en chance til.. folk siger jo det er smart :D
13. januar 2005 - 11:06
#34
Nu bliver jeg lige nødt til at spørge igen: struct medlem { char name[255]; char gade[255]; char post[255]; char by[255]; char tlf[255]; char mobil[255]; char email[255]; int medlem; struct medlem *ptrnext; }; struct medlem *ptrfirst = NULL; void listfromfile(void) { struct medlem *ptrthis; FILE *fp; ptrthis = ptrfirst; if( (fp = fopen("c:\\yeah666.txt", "r")) == NULL) { printf("Filen findes ej\n"); exit(1); } while(fread(&ptrthis, sizeof(ptrthis), 1, fp) ==1) { printf("\nNavn: %s\n", ptrthis->name); printf("\nGade: %s\n", ptrthis->gade); ptrthis = ptrthis->ptrnext; } } Programmet går ned når jeg når til funktionen "listfromfile".. Hvorfor?
13. januar 2005 - 11:12
#35
kommer ptrthis nogensinde til at pege på noget ?
13. januar 2005 - 11:14
#36
hmm.. egentlig peger den vel på NULL? eller hvordan?
13. januar 2005 - 11:18
#37
det gør den.. :/ Hva skal jeg så gøre?
13. januar 2005 - 11:20
#38
Du skal jo nok have malloc'et noget og sat den til at pege på det ...
13. januar 2005 - 11:25
#39
void listfromfile(void) { struct medlem *ptrthis; FILE *fp; ptrthis = malloc(sizeof(struct medlem)); if( (fp = fopen("c:\\yeah666.txt", "r")) == NULL) { printf("Filen findes ej\n"); exit(1); } if(ptrthis == NULL) { printf("NULL\n"); exit(1); } while(fread(&ptrthis, sizeof(ptrthis), 1, fp) ==1) { printf("\nNavn: %s\n", ptrthis->name); printf("\nGade: %s\n", ptrthis->gade); ptrthis = ptrthis->ptrnext; } } Programmet dør også der.. Du må undskylde de mange spørgsmål, men jeg har aldrig modtaget undervisning i hægtede lister, så det er helt fremmed grund for mig det :/
13. januar 2005 - 11:46
#40
Prøv at sammemligne nedenstående med din: while(ptrthis && /* ikke null pointer */ fread(ptrthis /* er pointer i forvejen */, sizeof(*ptrthis /* deref */), 1, fp) ==1) { printf("\nNavn: %s\n", ptrthis->name); printf("\nGade: %s\n", ptrthis->gade); /* hægtet liste med nye elementer indsat først. UTESTET */ ptrthis->ptrnext = ptrfirst; ptrfirst = ptrthis; /*ptrthis = ptrthis->ptrnext;*/ ptrthis = malloc(sizeof(struct medlem)); }
13. januar 2005 - 11:57
#41
Nu dør den da ikke.. men omvendt skriver den heller ikke noget ud :I
13. januar 2005 - 12:08
#42
while(fread(ptrthis, sizeof(*ptrthis), 1, fp) ==1) { printf("\nNavn: %s\n", ptrthis->name); printf("\nGade: %s\n", ptrthis->gade); ptrthis = ptrthis->ptrnext; } Sådan ser den ud pt..
13. januar 2005 - 18:38
#43
Umiddelbart ser det meget forkert ud. Første gang læser du ind i en buffer Anden gang læser du ind i noget som det du har læst fra disk peger på (hvilket formentligt er enten uallokeret eller allokeret af noget andet)
13. januar 2005 - 18:38
#44
Og et svar fra mig også
14. januar 2005 - 08:50
#45
// læser record in fra fil, fint nok. while(fread(ptrthis, sizeof(*ptrthis), 1, fp) ==1) { // udskriver indholdet af recorden også ok. printf("\nNavn: %s\n", ptrthis->name); printf("\nGade: %s\n", ptrthis->gade); // bruger den pointer der er læst ind fra disken, ikke OK! ptrthis vil enten pege på noget andet allokeret data hvorved det bliver korrupt eller på noget uallokeret, i hvilket tilfælde den næste allokering ødelægger de netop indlæste data, hvis du ikke bare får en pointer fejl med det samme. ptrthis = ptrthis->ptrnext; }
17. januar 2005 - 10:08
#46
Hej igen Undskyld den lange svartid, men jeg har haft en travl weekend :) Kan i lokkes til at fortælle mig, hvor fejlen ligger, og hvordan den skal rettes? Jeg kan simpelthen ikke gennemskue det :(
31. januar 2005 - 09:05
#47
Jeg lukker.
Kurser inden for grundlæggende programmering