Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Lesen und schreiben von Daten

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
29.09.2009, 20:01 Uhr
MB711



Hallo,

ich möchte ein Programm schreiben, welches eine Benutzerfrage nach dem Dateinamen, dessen Datentyps und dem Inhalt als Binärdatei anlegt. Dies sollte via (fopen-fwrite-fread-fclose) geschehen.
Nun habe ich ein kleines Example geschrieben, nur bekomme ich durchaus nicht die Werte geliefert, die ich eingebe. Wo liegt der Fehler?


C++:
#include <stdio.h>

int main( void )
{
   FILE *stream;
   char list[250], dateiname,endung,datentyp, wert;
   float MeineFloatVariable;

   printf ("Bitte geben Sie einen Dateinamen ein mit endung \".bin\" oder \".txt\" oder \".doc\" ein: ");
   scanf ("%s", &dateiname);
   printf ("Geben Sie für Charakter c ein und für einen Zahlenwert i ein und bestätigen Sie mit Return.");
   scanf ("%s", &datentyp);
   printf ("Eingabe.");
   scanf ("%f", &MeineFloatVariable);

   if( (stream = fopen( &dateiname, "w+t" )) != NULL )
   {
      if(datentyp == 'i')
         {
         fwrite( &MeineFloatVariable, sizeof(float), 1, stream );
         }
      if(datentyp == 'c')
         {}
      if ((datentyp != 'c') || (datentyp != 'i'))
         { }
      fclose( stream );
    
   }
   else
   printf( "Problem opening the file\n" );

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.09.2009, 21:49 Uhr
Hans
Library Walker
(Operator)


Hi,

der erste Fehler ist schon mal, dass Du hier

C++:
char list[250], dateiname,endung,datentyp, wert;


zu wenig Speicherplatz für die Zeichenketten einrichtest. Bist auf list wird für jede dieser Variabeln nur ein Zeichen Speicherplatz reserviert, nicht mehr. D.h. die Variable für Deinen Dateinamen umfasst auch nur ein Zeichen.
Der zweite Fehler ist hier:

C++:
fopen( &dateiname, "w+t" )

Du öffnest die Datei als Textdatei, das heisst aber nicht, das eine floatvariable dann auch als Text ausgegeben wird, wenn Du sie da rein schreibst. - Da kommt tatsächlich irgendwas undefiniertes bei heraus. Wenn Du mit binären Daten arbeiten willst, dann solltest Du die Datei auch als Binärdatei öffnen.
Und schliesslich ist der Quelltext für das Beispiel, das Du hier geschickt hast, unvollständig. Aber da blicken wir jetzt einfach mal drüber weg.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.09.2009, 00:47 Uhr
MB711



Hallo Hans,

das mit dem Dateinamen hatte trotzdem Funktioniert, aber ich werde auch für die anderen Character Speicherplatz reservieren.
Das mit der Binärdatei ist der Tipp gewesen, da habe ich meinen Fehler nicht gesehen - dass der Code nicht vollständig ist, ist mir auch klar.
Jetzt zur Binärdatei - ich lese diese ja am besten mit fread wieder aus - damit ich überhaupt sehe, was in der Datei steckt.


C++:
         fwrite( &MeineFloatVariable, sizeof(float), 1, stream );
         fread( &MeineFloatVariable, sizeof(float), 1, stream );                  



Um dies in meinem Ausgabefenster als Kontrolle anzeigen zu lassen, sollte ich mit printf dies ausgeben. Wie gebe ich fread in printf aus?

Danke, erst Mal!

Dieser Post wurde am 30.09.2009 um 01:18 Uhr von MB711 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.09.2009, 12:27 Uhr
~toxic
Gast



Zitat von MB711:
Wie gebe ich fread in printf aus?

gar nicht, du gibst "MeineFloatVariable" aus !
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.09.2009, 17:35 Uhr
~mb711
Gast


Jetzt werden die Fehler immer trivialer!

Erst wollte ich es so ausgeben:

C++:
printf( "%f",&MeineFloatVariable );



Dann mußte ich zu meinem Erstaunen feststellen, dass ohne anschließendes scanf das printf einfach übergangen wird(Auch nur mit Textinhalt). Das hat mich sehr verwundert! Wie behebe ich dies?

Gruß Jochen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.09.2009, 17:44 Uhr
MB711




C++:
#include <stdio.h>

int main( void )
{
   FILE *stream;
   char list[250], dateiname,endung[250],datentyp, wert[250];
   float MeineFloatVariable;

   printf ("Bitte geben Sie einen Dateinamen ein mit endung \".bin\" oder \".txt\" oder \".doc\" ein: ");
   scanf ("%s", &dateiname);
   printf ("Geben Sie für Charakter c ein und für einen Zahlenwert i ein und bestätigen Sie mit Return.");
   scanf ("%s", &datentyp);
   printf ("Eingabe.");
   scanf ("%f", &MeineFloatVariable);

   if( (stream = fopen( &dateiname, "w+" )) != NULL )
   {
      if(datentyp == 'i')
         {
         fwrite( &MeineFloatVariable, sizeof(float), 1, stream );
         fread( &MeineFloatVariable, sizeof(float), 1, stream );                  
         }
      if(datentyp == 'c')
         {
         }

      if ((datentyp != 'c') || (datentyp != 'i'))
         {      
         }
      fclose( stream );
   }
   else
   {}
  
   printf("%f", &MeineFloatVariable);
   scanf ("%f", &MeineFloatVariable);  
}


Bei der Ausgabe von MeineFloatVariable bekomme ich 0.0000 heraus, egal was ich eingegeben habe.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.09.2009, 20:29 Uhr
Hans
Library Walker
(Operator)


Hi,

damit:

C++:
printf( "%f",&MeineFloatVariable );


gibst Du (normalerweise) die Adresse aus, an der "MeineFloatVariable" im Speicher liegt. Da Adressen aber immer Integertypen sind, und keine Fliesspunktzahlen, wie float, kann das nicht funktionieren. Soweit ich weis, ist es eigentlich Zufall, das er da 0 (Null) ausgibt. Eigentlich sollte der Compiler an dieser Stelle auch irgendwas im Sinne von "Type mismatch", also Typenkonflikt meckern. Richtig wäre die Zeile so:

C++:
printf( "%f",MeineFloatVariable );

D.h. ohne dem & vor dem Variablennamen.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
30.09.2009, 21:13 Uhr
Hans
Library Walker
(Operator)


Hi,

ich stelle gerade fest, das hier:

C++:
   if( (stream = fopen( &dateiname, "w+" )) != NULL )
...
         fwrite( &MeineFloatVariable, sizeof(float), 1, stream );
         fread( &MeineFloatVariable, sizeof(float), 1, stream );



geht natürlich auch nicht. Wenn Du eine Datei zum schreiben öffnest, kannst Du auch nur darein schreiben, aber nicht daraus lesen. Wenn Du den Inhalt wieder lesen willst, muss Du Datei erst schliessen, und anschliessend zum lesen öffnen. Ich hab Dein Beispiel mal etwas verkürzt und passend umgebaut:

C++:
#include <stdio.h>
#include <string.h>

int main( void )
{
   FILE *stream;
   char dateiname[25];
   float MeineFloatVariable;

   MeineFloatVariable = 3.14159265;
   strcpy (dateiname, "floatzahl.dat");
  
   printf("Datei schreiben...");
   if( (stream = fopen( &dateiname, "wb+" )) != NULL )
   {
      fwrite( &MeineFloatVariable, sizeof(float), 1, stream );
      fclose( stream );
   }
   else
   {
     printf("Problem opening the file\n" );
   }
   printf("und schliessen.\n");

   printf("Datei lesen...");
   if( (stream = fopen( &dateiname, "rb" )) != NULL )
   {
      fread( &MeineFloatVariable, sizeof(float), 1, stream );                  
      fclose( stream );
   }
   else
   {
     printf("Problem opening the file\n" );
   }
   printf("und schliessen.\n");

   printf("%f\n", MeineFloatVariable);

  return 0;  
}



Hans


P.S. Nebenbei kannst Du an der Ausgabe sehen, wie die Zahl auf 7 Stellen zurecht gestuzt wird. - Ich gebe ja 9 Stellen an.
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 30.09.2009 um 21:25 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
01.10.2009, 09:25 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja schließen muss ma nsie nicht, du musst nur zurückspulen:


Zitat:

When the "r+", "w+", or "a+" access type is specified, both reading and writing are allowed (the file is said to be open for "update"). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, or fseek operation.




C++:
if(datentyp == 'i')
{
         fwrite( &MeineFloatVariable, sizeof(float), 1, stream );

       /* wieder an den anfang deiner variable zurückspringen */
       fseek(stream, -sizeof(float), SEEK_CUR);

       /* und auslesen */
         fread( &MeineFloatVariable, sizeof(float), 1, stream );                  
}



Du hast aber nach wie vor fehler in deinen Variablen:


C++:
char list[250], dateiname,endung[250],datentyp, wert[250];



dateiname ist nach wie vor nur ein zeichen, endung wird nie benutzt.

Das es bei dir im moment nicht abstürzt, liegt einzig und allein daran, das "endung" grade zufällig nach "dateiname" liegt, und du darin hineinschreiben darfst.
Das gleiche ist bei datentyp und wert der fall.

Falls dir möglich ist, C++ zu schreiben oder zu lernen. Dann lern das, dann brauchst du dich anfangs nicht mit dem speichergefrickel rumschlagen, sondern lernst lieber erstmal mit std::string und co, was dir das ganze abnimmt
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
01.10.2009, 16:47 Uhr
~mb711
Gast


Danke für die Tipps, es funktioniert nun. Bevor ich es poste, habe ich noch eine letzte Frage:

Ich möchte dem String dateiname dem des filetypes hinzufügen.

C++:
char dateiname[25],filetype[4];
dateiname = "nameX";
filetype = ".dat"
strcat(dateiname,filetype);



Leider wird habe ich 2Mal den dateiname und einmal der filetype in der dateiname(nameXnameX.dat) und nicht (nameX.dat). Wo liegt der Denkfehler?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: