Char-buffer ohne array

Hi @all,
ich hab da das probelm, dass bei folgendem code zwar alle funktioniert aber das was ich eingeb nicht groesser als 256 zeichen sein darf.
Code:
#include <stdio.h> 
#include <io.h> // Header für die dateifunktionen 

int main() 
{ 
   FILE * stream; 
   char buf[256]; // der puffer 

   // datei zum lesen ("r" = read) öffnen 
   if ((stream = fopen("datei.txt", "r")) == NULL) 
   { 
      printf("Datei konnte nicht geöffnet werden.\n"); 
      return -1;         // ende 
   } 

   // solange nicht das ende der datei erreicht ist 
   while (!feof(stream)) 
   { 
      // eine Zeile mit höchstes 256 bytes einlesen 
      fgets(buf, 256, stream); 
      // ausgeben 
      printf("%s", buf); 
   } 
    
   /* datei schließen */ 
   fclose(stream); 
    
   return 0; 
}

wie muesste ich das jetzter aendern damit ich im buffer (char buf[256]) unendlich viele zeichen eingeben kann?. ich weis das unendlich viele zeichen nicht moeglich sind aber ich glaub jeder weis was gemeint ist :-)

danke im vorraus, WhiteDragon
 
Hi sheep dude,
ich bin mir nicht sicher ob ich des richtig verstanden hab aber so wie ich das seh dann steht in dem tut nur wie man es macht wenn man weis wie viel speicher man anlegen will oder hab ich des falschverstanden?

wenn ichs falsch verstanden hab dann bitte ich dich des mir zu erklaeren :-)
wenn nicht hoffe ich das du oder jemand anderes noch eine idee auf meine frage hat.

danke im vorraus, WhiteDragon
 
Bin mir zwar nicht ganz sicher,
aber könnte man nicht String nehmen anstatt Char?
Würde das Problem doch denk ich mal lösen.
 
die einzige praktische möglichkeit, das wirklich unendlich groß (d.h. soviel der RAM hergibt) zu machen, ist eine Liste, also eine Klasse (oder ein record/struct), die ein char und einen zeiger auf eine andere (gleiche) klasse hat, das sieht dann so aus:
('H',->('a',->('l',->('l',->('o',nil)))))
== "Hallo"

Alles klar?
 
Das stimmt, dabei musst du wissen, wie viel Speicher du brauchst.
Die einzige Möglichkeit, das anders zu lösen, wäre wie blueflash vorschlägt, eine verkettete Liste zu basteln.
Vielleicht ist folgendes einfacher zu durchschauen:
Du hast eine Klasse 'node', die nur ein Element des Typs 'char' sowie einen Pointer auf eine nächste 'node' enthält.
Diese 'node'-Klasse wird dann in einer anderen Klasse, nenn sie z.B. 'charlist' verwendet, um beliebig große Strings zu speichern.
Ein Beispiel dafür findest du z.B. hier.
Dabei wirst du allerdings auch nicht um dynamischen Speicher herumkommen.

Die einfachste Lösung ist wie .tails schon sagt, einfach eine String-Klasse zu nehmen, die garantiert bei deinem Compiler mitgeliefert wird.
Diese Klasse ist an sich aber auch nichts anderes als eine clever gebastelte verknüpfte Liste.
 
Original von blueflash
die einzige praktische möglichkeit, das wirklich unendlich groß (d.h. soviel der RAM hergibt) zu machen, ist eine Liste,

??? also praktikabel ist das irgendwie ueberhaupt nicht....wenn du klassen hast, bewegst du dich im bereich c++ wo du ja die schoene string klasse fuer sowas hast.

@WhiteDragon: was ist genau dein ziel? ein "dynamisches array" waehre wie schon vorgeschlagen eine liste/vector. jedoch sind diese nicht sehr effizient....sprich einiges langsamer als die buffer loesung welche du bis jetzt hast.
 
geht auch ohne Klassen mit nem struct und ein zwei funtkionen

Code:
typedef struct buffer{
   char* data;
   unsigned int length;
   unsigned int size;
}buffer_t;

size um dir zu merken wie groß dein Puffer ist, length um dir zu merken wieviel Bytes schon um Puffer sind.

malloc()/realloc()/memcpy()/free dürfte dir recht hilfreicht sein.
 
..oder die standardlist mit einem pointer auf das nächste element.
man kann sich aber auch ein loch ins knie bohren um daran einen anker für..

mit so einer struktur schafft man sich mehr speicher-overhead also nötig.
eigentlich kommt man doch bei dateien mit buffern gut aus, oder?
 
Dann macht die Standard-List aber erst richtig overhead.

afaics macht die STL--Liste mehr overhead als ein struct und zwei drei Helferfunktionen.
 
nimmt mich wunder, was ihr da verarbeitet, dass ihr euch sorgen ueber ein paar byte verbratenen speicher (pro eintrag) macht.
 
Zurück
Oben