Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Dateigröße (einfach aber es klappt nicht)

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 ] [ 3 ]
000
21.10.2003, 15:30 Uhr
the.messias



Ich möchte gern eine Textdatei komplett in einen String einlesen. Leider scheitert es da immer wieder an der Dateigröße, die man bei fopen mit angeben muss.
kann mir bitte mal jmd. ein Beispielprogramm zeigen womit ich das dann hin bekomme.
Vielen Dank :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
21.10.2003, 15:32 Uhr
virtual
Sexiest Bit alive
(Operator)


Wo gibst Du denn bei fopen die Dateigröße an???
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
21.10.2003, 15:35 Uhr
the.messias



oh, habe ich fopen gesagt?! Ich meine natürlich fread!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
21.10.2003, 15:46 Uhr
typecast
aka loddab
(Operator)


Du musst bei fread nicht die Dateigröße angeben, sondern die Anzahl der Bytes, die in ein Objekt gelsen werden sollen. Wenn du z.B. eine ungewisse Anzahl von int-Zahlen auslesen willst, dann kannst du das so machen:

C++:

int i;
while (!feof(datei))
{
      fread(&i, sizeof(int), 1, datei);
      printf("%d  ", i);
}



--
All parts should go together without forcing. ... By all means, do not use a hammer. (IBM maintenance manual, 1925)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
21.10.2003, 15:57 Uhr
the.messias



also irgendwas mach ich falsch:

C++:
        char* inhalt;
        char zeichen;
        while (!feof(myDatei))
        {
            fread(zeichen, sizeof(char), 1, myDatei);
            strcat(inhalt, zeichen);
        }

        fclose(myDatei);





Code:
Fehler:
[C++ Fehler] pev_frm.cpp(312): E2034 Konvertierung von 'int' nach 'void *' nicht möglich
[C++ Fehler] pev_frm.cpp(312): E2342 Keine Übereinstimmung des Typs beim Parameter '__ptr' ('void *' erwartet, 'char' erhalten)
[C++ Fehler] pev_frm.cpp(313): E2034 Konvertierung von 'int' nach 'const char *' nicht möglich
[C++ Fehler] pev_frm.cpp(313): E2342 Keine Übereinstimmung des Typs beim Parameter '__src' ('const char *' erwartet, 'char' erhalten)



Ich möchte gern am ende einen String haben wo der gesamte Dateiinhalt drin steht.

--edit: Pablo. [ cpp ] tags gesetzt --
[edot loddab] code-Tags korrigiert [/edit]

Dieser Post wurde am 21.10.2003 um 16:05 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
21.10.2003, 16:21 Uhr
virtual
Sexiest Bit alive
(Operator)


Du belegst keinen Speicher. Dazu noch fread falsch angewendet. So oder soähnlich kann es gehen:

C++:
char* inhalt = malloc(4096);
int len = 0;
int read_len = 0;

if (NULL==inhalt)
{
   /* fehler */
}
do
{
     read_len = fread(inhalt+len, 4095, myDatei);
     if (read_len==4095)
     {
         char* ptr = realloc(inhalt, len+4096);
         if (ptr==NULL)
         {
              free(inhalt);
              /* Fehler */
         }
     }
     len += read_len;
} while(read_len==4095);
inhalt[len] = 0;
fclose(myDatei);

/* Hier mit Inhalt arbeiten, len gibt die gesamtlänge an */
...

/* Aufräumen nicht vergessen */
free(inhalt);


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
21.10.2003, 16:30 Uhr
the.messias



oh, vielen Dank für die Mühe..ich probier das gleich mal aus

lg the.messias
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.10.2003, 09:39 Uhr
the.messias



Oh, vielen dank für die Mühe. Ich hätte nicht gedacht, dass das doch so kompliziert ist.

mfg Marcel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.10.2003, 10:03 Uhr
the.messias



Ich hab den Quelltext von dir (virtual) gerade mal implementiert, aber ich bekomme wieder einen Haufen Fehler. Kann es daran liegen, dass ich die Datei einer Funktion übergebe und ich in der Funktion damit arbeite?? Das kann aber nicht sein.
Hier nochmal die Fehler, die ich bekomme:

Code:
Fehler:
E2034 Konvertierung von 'void *' nach 'char *' nicht möglich
E2034 Konvertierung von 'FILE *' nach 'unsigned int' nicht möglich
E2342 Keine Übereinstimmung des Typs beim Parameter '__n' ('unsigned int' erwartet, 'FILE *' erhalten)
E2193 Zu wenige Parameter im Aufruf von 'fread(void *,unsigned int,unsigned int,FILE *)'
E2034 Konvertierung von 'void *' nach 'char *' nicht möglich
E2190 Unerwartetes }



Hier nochmal der Quellcode, den ich jetzt habe:

C++:
void use_dat(FILE *myDatei)
{
        char* inhalt = malloc(4096);
        int len = 0;
        int read_len = 0;
        if (NULL == inhalt)
        {
            PaMessage::Info("Fehler 1");
        }
        do
        {
            read_len = fread(inhalt+len, 4095, myDatei);
            if (read_len == 4095)
            {
               char* ptr = realloc(inhalt, len + 4096);
               if (ptr==NULL)
               {
                  free(inhalt);
                  PaMessage::Info("Fehler 2");
               }

            }
        }while (read_len==4095);
        inhalt[len] = 0;
        fclose(myDatei);
        //Hier bearbeite ich den String
        free(inhalt);
}



Das was ich daran gar nicht verstehe, warum muss man Ihnalt eine feste Speichergröße am Anfang zuweisen???

MfG Marcel

Dieser Post wurde am 22.10.2003 um 10:07 Uhr von the.messias editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
22.10.2003, 10:45 Uhr
virtual
Sexiest Bit alive
(Operator)


Ja, das war von mir jetzt nicht großartrig getestet. Das hier auch nicht, aber ich denke, so gehts was besser:


C++:
void use_dat(FILE *myDatei)
{
        char* inhalt = (char*)malloc(4096);
        int len = 0;
        int read_len = 0;
        if (NULL == inhalt)
        {
            PaMessage::Info("Fehler 1");
        }
        do
        {
            read_len = fread(inhalt+len, 4095, 1, myDatei);
            if (read_len == 4095)
            {
               char* ptr = (char*)realloc(inhalt, len + 4096);
               if (ptr==NULL)
               {
                  free(inhalt);
                  PaMessage::Info("Fehler 2");
               }

            }
        }while (read_len==4095);
        inhalt[len] = 0;
        fclose(myDatei);
        //Hier bearbeite ich den String
        free(inhalt);
}



Zitat:

Das was ich daran gar nicht verstehe, warum muss man Ihnalt eine feste Speichergröße am Anfang zuweisen???


Was würde denn passieren, wenn Du es nicht tun würdest? - Dann würdest Du fread machen, aber wohin soll den gelesen werden? Du brauchst immer Speicher, wenn du fread machst. Ob der nun gemalloc'd oder statisch ist, ist egal, solange er da ist. In unserem Fall müssen wir aber malloc machen, weil die Schleife den Speicher vergrößern muß, das geht nicht mit statischen Puffern
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ 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: