Größe eines Buffers feststellen

Abfluß

Grünschnabel
Gibt es Alternativen zum folgenden Code:

C:
// obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

http://www.cplusplus.com/reference/cstdio/fread/

Ich möchte fseek loswerden.
 
Hallo,

wenn du nicht auf C festgelegt bist, kann man den Code auch alternativ mit C++ umsetzen:
C++:
#include <fstream>

// ...

std::ifstream ifs("datei.ext");

if( ifs.is_open() )
{
    ifs.seekg (0, std::ios::end);
    int nLength = file.tellg();
    ifs.seekg (0, std::ios::beg);
    
    char* pBuffer = new char[nLength];
    
    ifs.read(pBuffer, nLength);
    ifs.close();
    
    // ...
    
    delete [] pBuffer;
}
Allerdings bleibt das Prinzip das Gleiche, nämlich den Dateizeiger erst ans Dateiende zu positionieren, um die Größe zu ermitteln. Daher verstehe ich deine Motivation zum Loswerden von "fseek" nicht.

Gruß
MCoder
 
Daher verstehe ich deine Motivation zum Loswerden von "fseek" nicht.

Ich muß den Dateizeiger erst ans Dateiende positionieren, um die Größe zu
ermitteln (wie du gesagt hast); aber um das zu tun, muß ich auch SEEK_END
benutzen. Das gefällt mir nicht, weil es nicht übertragbar ist. Das ist das
Problem.

Kann ich das ohne SEEK_END (in C) tun?

* Library implementations are allowed to not meaningfully support SEEK_END (therefore, code using it has no real standard portability).

http://www.cplusplus.com/reference/cstdio/fseek/
 
Zuletzt bearbeitet:
Hallo,

dann dann könntest du die Dateigröße mit "stat" ermitteln:
C:
#include <sys/stat.h>

struct stat st;
stat("datei.ext", &st);
long nSize = st.st_size;
Gruß
MCoder
 
Gibt es einen Grund, nSize in deinem Code zu benutzen?

Der folgende Code auch funktioniert:

C:
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>

int main ()

{

    FILE * mDatei = fopen("datei.txt", "r");

    struct stat st;
    stat("datei.txt", &st);

    char * buffer = (char *) malloc(sizeof (char) * st.st_size);
    fread(buffer, st.st_size, 1, mDatei);
    
    printf("\n\n%s\n\n", buffer);

    return 0;

}
 
Hallo Abfluss

Der Grund warum deepthroats Code die Variable nSize hat ist um zu zeigen, dass st_size für die Grösse der Datei steht.

Bezüglich sizeof(char): Der sizeof operator ist im standard so definiert dass sizeof(char) immer 1 ist. Es macht eigentlich auch nicht wirklich Sinn st_size mit etwas >= 1 zu mulitplizieren, schliesslich kannst du nicht mehr auslesen als das.

Grüsse
Muepe
 
Bezüglich sizeof(char): Der sizeof operator ist im standard so definiert
dass sizeof(char) immer 1 ist. Es macht eigentlich auch nicht wirklich Sinn
st_size mit etwas >= 1 zu mulitplizieren, schliesslich kannst du nicht mehr
auslesen als das.

Der Ordnung halber ist es nicht beßer, sizeof(char) mit st_size zu
multiplizieren? Aus einem ähnlichen Grund, daß er "nSize" und ein stat
struct Element in seinem Code zusammen benutzte?

Ich tat es vornehmlich wegen cplusplus.com:

http://www.cplusplus.com/reference/cstdio/fread/

C:
// obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);
 
  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);  // <--- 
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
 
Zuletzt bearbeitet:
Der Ordnung halber ist es nicht beßer, sizeof(char) mit st_size zu
multiplizieren? Aus einem ähnlichen Grund, daß er "nSize" und ein stat
struct Element in seinem Code zusammen benutzte?

Hallo Abfluss

Der Standard von C (ebenso der von C++) schreibt vor dass sizeof(char), sizeof(signed char), sizeof(unsigned char) immer 1 sein muss, ergo bewirkt diese Anweisung auf keiner Platform irgendwas, wenn du es in einer Multiplikation verwendest. Zudem ist es eher unordentlich st_size mit irgendwas integralem zu multiplizieren (ausser 0). Werte < 0 machen hinten und vorne keinen Sinn und wenn der Wert grösser als 1 ist würdest mehr Speicher allozieren als in der Datei drin ist. Die einzigen integralen Werte sind 0 und 1. Von diesen zweien macht der erste keinen Sinn und der zweite bewirkt nichts, schlussendlich ist für diesen Verwendungszweck eine Multiplikation wirklich unnötig.

Was man rechtfertigen kann wäre das:
C:
char* buffer;

buffer = (char*)malloc(sizeof(*buffer) * stat.st_size);

Damit könntest du den Typ von buffer flexibel halten, und dann etwas damit machen, was schlussendlich in mehr Speicherverwendung resultiert als Bytes in der Datei sind. Aber auch das ist eine gekünstelet Situation die nicht wirklich Sinn macht.

Grüsse
Cromon
 

Neue Beiträge

Zurück