Die Mathe-Redaktion - 23.06.2018 02:39 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
Listenpunkt1 im Schwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktAnmeldung MPCT Juli
ListenpunktFormeleditor fedgeo
Schwarzes Brett
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 85 Gäste und 2 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » C: Einlesen eines Struct
Druckversion
Druckversion
Autor
Universität/Hochschule J C: Einlesen eines Struct
Specialagent
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 17.11.2012
Mitteilungen: 66
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2018-01-14


Hallo,

ich habe eine Struktur mit 5 Komponenten definiert und möchte anschließend mittels einer Funktion alle Komponenten einlesen und in einer Variablen speichern. Leider klappt dies noch nicht ganz. Im Code sind noch andere Funktionen zu sehen und wie in der Main zu sehen werden auch noch andere folgen. Ich hoffe, das stört aber erstmal nicht.

Insbesondere erhalte ich bei fgets() die Fehlermeldung zu wenig Argumente. Ich habe doch aber die 3 Argumente genutzt, die gefordert sind? Könnte mir bitte jemand erklären wo mein Fehler liegt. Danke.
C
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <string.h>
  5. #include <time.h>
  6.  
  7. enum{ STRLEN = 100 };
  8. enum{ PLLEN = 100 };
  9.  
  10. typedef struct
  11. {
  12. char interpret[STRLEN];
  13. char titel[STRLEN];
  14. unsigned int jahr;
  15. unsigned int minuten;
  16. unsigned int sekunden;
  17. } Song;
  18.  
  19. /* Diese Funktion gibt einen zufaelligen Index
  20.   zwischen 0 und laenge-1 zurueck */
  21. int zufallsIndex( int laenge ) {
  22. return (int) rand()%laenge;
  23. }
  24.  
  25. int laden( Song *playlist ) {
  26.  
  27. FILE* fin = NULL;
  28. int n = 0;
  29.  
  30. if ( ( fin = fopen( "playlist.dat", "rb" ) ) != NULL ) {
  31. while ( fread( &(playlist[n]), sizeof(Song), 1, fin ) > 0 && n < PLLEN )
  32. n++;
  33. printf("\nDatensaetze geladen!\n\n");
  34. fclose( fin );
  35. } else {
  36. printf("\nDerzeit sind keine Datensaetze gespeichert!\n\n");
  37. }
  38.  
  39. return n;
  40. }
  41.  
  42. void speichern( Song *playlist, int laenge ) {
  43.  
  44. FILE* fout = NULL;
  45.  
  46. if ( ( fout = fopen( "playlist.dat", "wb" ) ) != NULL ) {
  47. fwrite( playlist, sizeof(Song), laenge, fout );
  48. printf("\nDatensaetze gespeichert!\n\n");
  49. fclose( fout );
  50. } else {
  51. printf("\nSpeichern fehlgeschlagen\n\n");
  52. }
  53. }
  54.  
  55.  
  56. /* Diese Funktion liest alle Attribute eines Songs
  57.   aus der Kommandozeile und gibt einen struct vom Typ Song zurÞck */
  58. Song einlesen( void )
  59. {
  60. printf("Interpret: ");
  61. fgets(Song.interpret, STRLEN, stdin);
  62. printf("Titel: ");
  63. fgets(Song.titel, STRLEN, stdin);
  64. printf("Jahr: ");
  65. scanf("%4u", &Song.jahr);
  66. printf("Minuten: ");
  67. scanf("%u", &Song.minuten);
  68. printf("Sekunden: ");
  69. scanf("%u", &Song.sekunden);
  70. }
  71.  
  72. int main( void )
  73. {
  74.  
  75. Song playlist[PLLEN];
  76. int laenge = 0, fertig = 0;
  77. char eingabe;
  78.  
  79. srand(time(NULL));
  80.  
  81. while ( !fertig )
  82. {
  83. printf("\nl: laden\n");
  84. printf("s: speichern\n");
  85. printf("e: einlesen\n");
  86. printf("d: loeschen\n");
  87. printf("a: ausgeben\n");
  88. printf("m: mischen\n");
  89. printf("j: jahr suchen\n");
  90. printf("i: interpret suchen\n");
  91. printf("b: beenden\n\n");
  92. printf("Eingabe: ");
  93.  
  94. scanf(" %c", &eingabe );
  95.  
  96. switch( eingabe )
  97. {
  98. case 'l': laenge = laden( playlist ); break;
  99. case 's': speichern( playlist, laenge ); break;
  100. case 'b': fertig = 1; break;
  101. case 'e': einlesen(); break;
  102. default: printf("Funktion nicht verfuebar!\n\n");
  103. }
  104.  
  105. }
  106.  
  107. return 0;
  108. }



  Profil  Quote  Link auf diesen Beitrag Link
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 2152
Aus: Berlin
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2018-01-14


Alle Fehler stecken in dieser Funktion:
Song einlesen( void )
{
  printf("Interpret: ");
  fgets(Song.interpret, STRLEN, stdin);
  printf("Titel: ");
  fgets(Song.titel, STRLEN, stdin);
  printf("Jahr: ");
  scanf("%4u", &Song.jahr);
  printf("Minuten: ");
  scanf("%u", &Song.minuten);
  printf("Sekunden: ");
  scanf("%u", &Song.sekunden);
}

Song ist ein Datentyp, ein Ausdruck wie Song.interpret ergibt daher keinen Sinn. Du brauchst eine Variable vom Typ Song, deren Felder du dann belegst und die du schließlich mit return zurückgibst.
  Song song;
  fgets(song.interpret, STRLEN, stdin);
  ...
  return song;

Was du dann in der main() mit dem Ergebnis anfängst, musst du dir auch noch überlegen, im Moment wird es einfach weggeworfen.


-----------------
⊗ ⊗ ⊗



  Profil  Quote  Link auf diesen Beitrag Link
dromedar
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 26.10.2013
Mitteilungen: 4986
Aus: München
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, eingetragen 2018-01-14


Hallo Specialagent,

2018-01-14 14:41 - Specialagent im Themenstart schreibt:
Insbesondere erhalte ich bei fgets() die Fehlermeldung zu wenig Argumente. Ich habe doch aber die 3 Argumente genutzt, die gefordert sind?

Dein erstes Argument entspricht aber überhaupt keiner Variablen, sondern bezieht sich nur auf den Typ 'Song':
C
  1. Song einlesen( void )
  2. {
  3. printf("Interpret: ");
  4. fgets(Song.interpret, STRLEN, stdin);
  5. printf("Titel: ");
  6. fgets(Song.titel, STRLEN, stdin);
  7. printf("Jahr: ");
  8. scanf("%4u", &Song.jahr);
  9. printf("Minuten: ");
  10. scanf("%u", &Song.minuten);
  11. printf("Sekunden: ");
  12. scanf("%u", &Song.sekunden);
  13. }


Du muss eine Variable mit dem Typ 'Song' einführen und die dann auch als Ergebnis der Funktion zurückgeben.

Grüße,
dromedar



  Profil  Quote  Link auf diesen Beitrag Link
Specialagent
Aktiv Letzter Besuch: im letzten Monat
Dabei seit: 17.11.2012
Mitteilungen: 66
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.3, vom Themenstarter, eingetragen 2018-01-14


Oh man, solch ein dummer Fehler.

Danke euch für die schnelle Hilfe!



  Profil  Quote  Link auf diesen Beitrag Link
Specialagent hat die Antworten auf ihre/seine Frage gesehen.
Das Thema wurde von einem Senior oder Moderator abgehakt.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2018 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]