-
18.11.11 17:40 #1
- Registriert seit
- Jun 2011
- Beiträge
- 76
Hallihallo,
ich bekommen den Fehler: error C2106: '=': Linker Operand muss ein L-Wert sein(Zeile 51)
Ich weiß zwar was dieser Fehler bedeutet:
3=x --> macht keine Sinn, weil x in 3 speichern.. naja
--> Linker Operand muss ein L-Wert sein.
x=3 --> macht sinn, da man x 3 zuweist, also 3 in x speichert.
Aber ich verstehe das bei mir nicht mein linker Operand ist ja eine Struktur und diesen will ich halt ein ausgelesenens Wort zuweisen.
Oder weise ich da überhaupt falsch zu?
Funktion des Programms: Es soll einfach die 1. Zeile auslesen(indem Fall 1 Wort) und dann in "vorname" speichern.
In adressen.txt stehen einfach Adressen z.b:
Franz
Müller
Hofburgstraße 13
Schuhgröße 37
Größe 175
und noch mehr Adressen...
Franz soll in vorname, Müller in Nachname usw. gespeichert werden und wenn die Schuhgröße unter 38 ist, dann soll es die gesamte Adresse auf dem Bildschirm ausgeben.
Das Programm ist noch nicht fertig, da ich den eine Fehler mal beheben will.
Programm:
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
#include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #define MAXSTRING 100 struct adresse { char vorname[MAXSTRING]; char nachname[MAXSTRING]; char strasse [MAXSTRING]; char ort[MAXSTRING]; char PLZ[MAXSTRING]; }; struct personendaten_struct { struct adresse adresse; int schuhgroesse; float groesse; }; typedef struct personendaten_struct personendaten; int main() { FILE*fileio = NULL; char text[MAXSTRING]; int x=0; personendaten theperson; fileio=fopen("adressen.txt","r"); if(fileio == NULL) { printf("Fehler beim LESEN der Datei adressen.txt"); exit(-1); } while(!feof(fileio)) { fgets(text,MAXSTRING,fileio); x++; if(x == 1) { theperson.adresse.vorname=text; } } fclose(fileio); return(0); }
mfg GooglehupfGeändert von Googlehupf (18.11.11 um 18:03 Uhr)
-
Hallo,
ein Array ist kein L-Wert. Um Arrays zu kopieren, musst du z.B. memcpy verwenden. In diesem Fall ist aber strcpy angebrachter, da du eine Zeichenkette kopieren willst.
Grüße,
Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
18.11.11 21:02 #3
- Registriert seit
- Jun 2011
- Beiträge
- 76
Ich danke dir.
Hab das Programm jetzt geschrieben, aber ich bräuchte vielleicht paar Tipps, Hinweise bitte
.
Die konkrete Aufgabenstellung ist:
Kurzbeschreibung : Programm zum Arbeiten mit Strukturen.
Schreiben Sie ein Programm das die
personendaten (typedef struct ......) von einer Textdatei einliest
und alle Personen und deren Adresse ausgibt die eine Schuhgrösse kleiner 38
haben.
In adressen.txt steht(die 5. Zeile ist die PLZ, die 6. die Schuhgröße und die 7. Zeile die Größe, also die zeilen jeweils bei den Adressen):
Code :1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Lieselotte Musterschülerin Buseckerstrasse 44 Heppenheim 4443 38 172 Peter Jackson Mall street 10 USA 7860 45 189 Harry Potter Hogwarts 45 England 9234 35 178 Tom Turbo Turbohofgasse 1 Torbio 0001 22 156
So hab ichs versucht(in den comments steht warum das es maybe nicht funktioniert):
Code cpp:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
#include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #define MAXSTRING 100 struct adresse { char vorname[MAXSTRING]; char nachname[MAXSTRING]; char strasse [MAXSTRING]; char ort[MAXSTRING]; char PLZ[MAXSTRING]; }; struct personendaten_struct { struct adresse adresse; char schuhgroesse[MAXSTRING]; char groesse[MAXSTRING]; }; typedef struct personendaten_struct personendaten; int main() { FILE*fileio = NULL; char text[MAXSTRING]; int x=0; int i=0; personendaten theperson; fileio=fopen("adressen.txt","r"); if(fileio == NULL) { printf("Fehler beim LESEN der Datei adressen.txt"); exit(-1); } while(!feof(fileio)) { fgets(text,MAXSTRING,fileio); x++; if(x == 1) { strncpy(theperson.adresse.vorname,text,MAXSTRING); } if(x == 2) { strncpy(theperson.adresse.nachname,text,MAXSTRING); } if(x == 3) { strncpy(theperson.adresse.strasse,text,MAXSTRING); } if(x == 4) { strncpy(theperson.adresse.ort,text,MAXSTRING); } if(x == 5) { strncpy(theperson.adresse.PLZ,text,MAXSTRING); } if(x == 6) { strncpy(theperson.schuhgroesse,text,MAXSTRING); i=atoi(text);//wenn dann text="38" ist, dann ist ja i != 38, weils ja ungewandelt wird von string in int oder? if(i < 38) { printf("%s",theperson.adresse.vorname); printf("%s",theperson.adresse.nachname); printf("%s",theperson.adresse.strasse); printf("%s",theperson.adresse.ort); printf("%s",theperson.adresse.PLZ); printf("%s",theperson.schuhgroesse); } } if(x == 7) { strncpy(theperson.groesse,text,MAXSTRING); x=0; } } fclose(fileio); return(0); }
Danke im voraus!
-
Hi
also zuerst einmal würde ich Schuhgröße etc. als int speichern.
In der Schliefe, statt eine Zeile einlesen und if 1 bis 7:
Warum nicht pro Schleifendurchgang alle 7 Zeilen einlesen?
Warum nur ggf. bei jeder 6. Zeile Personen je nach Schuhgröße ausgeben?
Wenn du, wie im oberen Absatz, alles in einem Schleifendurchgang einliest,
hast du das "Problem" nicht.
puts statt printf-%s nehmen. Ist nicht falsch, aber vergleichsweise langsam.
Und doch, atoi("38") ergibt die Zahl 38. Das ist der alleinige Sinn von atoi.
Was ist jetzt eigentlich die Frage gewesen?Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
18.11.11 21:34 #5
- Registriert seit
- Jun 2011
- Beiträge
- 76
Mh... fgets liest doch nur bis zu einen \n. Befehle die weiter Zählen hätten wir noch nicht gelernt.
Wie könnt das den gehn(ohne einen neuen Befehl
)?
Naja, weil ja "text" nach der 7. Zeile wieder anderst ist... und ich die Schuhgröße steht ja in der 6. Zeile.Warum nur ggf. bei jeder 6. Zeile Personen je nach Schuhgröße ausgeben?
Eigentlich eh wie man das fehlerhafte Programm besser schreiben könnte.Was ist jetzt eigentlich die Frage gewesen?
-
18.11.11 21:55 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.
Hinzu kommt, das du überhaupt keine Eingaben auf Erfolg prüfst. Du mußt doch sicherstellen, dass du einen Datensatz auch komplett eingelesen hast!
Warum liest du denn die Daten nicht gleich in die Struktur ein?
Bsp:
Noch besser wäre es, du würdest dir eine Funktion zum Einlesen in die Struktur schreiben die du dann in der Schleife immer nur aufrufen mußt.Code c:
GrußGeändert von deepthroat (18.11.11 um 22:01 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
19.11.11 11:16 #7
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Außerdem, warum verwendest du nicht statt fputs/fgets eher die Funktionen fread/fwrite? Damit könntest du die komplette Struktur schreiben und lesen und müsstest nicht an den Struktur-Elementen rum pfriemeln. Du verwendest ja nicht mal Pointer in deinen Strukturen, sollte also ohne Probleme funktionieren.
Beispiel:
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
Zumindest bis man den Compiler, dessen Einstellungen oder die Plattform wechselt. Compilern steht es nämlich frei, beliebig Füllbytes zwischen Membern einer Struktur einzufügen. Da kann es schnell zu Inkompatibilitäten kommen. Im allgemeinen ist das Schreiben oder Lesen von Strukturen mit einem Aufruf also nicht zu empfehlen, es sei denn man weiß genau, was man tut (z.B. wenn man die Füllbytes per Compilerdirektive deaktiviert hat).
Abgesehen davon wäre das Format dann nicht mehr menschenlesbar.
Grüße,
Matthias„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
19.11.11 16:19 #9
- Registriert seit
- May 2006
- Ort
- There is no place like 127.0.0.1
- Beiträge
- 3.516
Gut, was ist mit attribute packed? Dann wäre "nur" das Problem, das die Datentypen alle die gleichen Byte-Größen haben müssen, zu mindest wenn man den Compiler wechselt.
Geändert von saftmeister (19.11.11 um 16:19 Uhr) Grund: Ergänzung
Grüße
--
Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)
-
„Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
“For every complex problem, there is an answer that is short, simple and wrong.”
“Pessimism is safe, but optimism is a lot faster!”
Aktuelles Coding Quiz: #17 - Wörter kreuz und quer
-
26.11.11 10:40 #11
- Registriert seit
- Jun 2011
- Beiträge
- 76
-
Liest einen String von datei in p.name rein, maximal aber sizeof(p.name) Byte.Code cpp:
1
fgets(p.name, sizeof(p.name), datei)
Weil mehr passt ja nicht rein (sizeof ergibt in dem Fall die Byteanzahl).
Das "!=NULL" deswegen, weil fgets im Fehlerfall NULL liefert (Fehler ist zB auch das Dateiende).
Die while liest damit so lange ganze Personen ein, bis es nicht mehr geht bzw. die Datei aus ist.
In der Schleife hast du eine fertige Person, mit der du was machen kannst.
Im nächsten Schleifendurchgang die nächste Perosn usw.Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
"Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?
-
26.11.11 11:14 #13
Moin,
weil fgets die Quelle zeilenweise einliest - vgl. hier :
http://pronix.linuxdelta.de/C/standa...ung_19_3.shtml
so ist das nicht zu lesen, sondern ob das Ergebnis von fgets ungleich null ist :
vgl. auch hier den obigen Link!Code cpp:1
fgets( p.name, sizeof(p.name), datei ) != NULL
Gruß
KlausEs ist noch kein Meister vom Himmel gefallen - sonst hätte man schon längst seine Leiche gefunden !!
Falls ich helfen konnte, wäre eine Bewertung oder ein Danke nett ;-)
-------------------------------------------------------------------------------------------------
Ich beantworte keine Fragen per PN !!
Stellt Eure Fragen im Forum - dann haben alle etwas davon !!
-
26.11.11 11:24 #14
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Weil du alle Datensätze verarbeiten willst.
Vermutlich hast du nicht verstanden, dass das die einzige Schleife ist. Der Schleifenblock würde aber nur ausgeführt werden wenn alle Zeilen die zu einem Datensatz gehören eingelesen sind.
Wie gesagt, eine Funktion dafür wäre deutlich schöner:
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
26.11.11 14:06 #15
- Registriert seit
- Jun 2011
- Beiträge
- 76
Also, fgets ist so definiert: char * fgets ( char * str, int num, FILE * stream )
Da wo int num steht, steht sizeof(.....), aber warum kann man hier nicht die maximale größe des Strings hineinschreiben in unserem Fall?
Also: MAXSTRING ?
Wenn man das !=NULL weglässt, dann müsste man theoretisch eine while(!feof(....)) schreiben oder?Das "!=NULL" deswegen, weil fgets im Fehlerfall NULL liefert (Fehler ist zB auch das Dateiende).
Die while liest damit so lange ganze Personen ein, bis es nicht mehr geht bzw. die Datei aus ist.
In der Schleife hast du eine fertige Person, mit der du was machen kannst.
Im nächsten Schleifendurchgang die nächste Perosn usw.
Ähnliche Themen
-
Wert per php aus tabelle abfragen wenn wert erreicht soll spalte 2 um eines erhöht
Von bastiekleve im Forum PHPAntworten: 64Letzter Beitrag: 17.12.10, 20:23 -
[C#] In ListBox soll jeder Wert einmalig sein
Von RescueThePinguins im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 07.01.10, 22:56 -
Linker Balken, soll bis nach ganz unten gehen...
Von Darian im Forum CSSAntworten: 2Letzter Beitrag: 31.08.08, 03:02 -
DataGridView - Linker Grauer Bereich soll weg
Von Athor im Forum .NET Windows FormsAntworten: 2Letzter Beitrag: 20.11.07, 14:36 -
linker frame soll größe beibehalten.
Von sunflower84 im Forum HTML & XHTMLAntworten: 10Letzter Beitrag: 27.07.05, 16:00



31Danke

Zitieren


Login






