• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

FILE *datei wird nicht komplett ins array geschrieben???

Hallo!

Ich möchte mit folgenden Code eine bzw mehrere Dateien bearbeiten.
Dazu habe ich, wie im Code zu sehen, versucht eine Datei zu öffnen und diese in ein riesiges Array zu packen.
Irgendwie will mit meinem Test das Programm die Datei nicht vollständig kopieren??

Wenn ich malloc weglasse und durch ein statisches array erstetze funktioniert es anstandslos.
Bitte helft mir!!


Code:
char *FILE_RAM(char *n_datei)
{
  struct stat attribut;
  long z_datei, x;
  char *buffer;
  unsigned int c;
  
  FILE *datei = fopen(n_datei, "r+b");
  if(datei == NULL)
  {
    printf("Datei: %s konnte nichte geoeffnet werden!\n", n_datei);
    return "1";
  }
  
  else
  {
    if(stat(n_datei, &attribut) == -1)
    {
      printf("Fehler bei stat\n");
      return "1";
    }
    z_datei = attribut.st_size;
  }

  buffer = malloc(z_datei * sizeof(char));
  if(buffer == NULL)
  {
    printf("Fehler bei malloc\n");
    return "1";
  }
  
  for(x=0; x<=z_datei; x++)
  {
    c=fgetc(datei);
    buffer[x] = c;
  }
  
  printf("z_datei = %ld\n", z_datei);
  printf("strlen(buffer) = %ld\n", strlen(buffer));
  
  //FÜR TESTZWECKE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  FILE *neu = fopen("neu","w+b");
  for(x=0; x<=z_datei; x++)
    putc(buffer[x], neu);
  ////////////////////////////////////////////////////////////////
  fclose(datei);
  return buffer;
}
 
Wie schon Larry Wall feststellte (als er es versuchte), ist es recht schmerzhaft, Textdateien in C zu verarbeiten. Das hat ihn 1986 veranlaßt, eine "Practical Extraction and Report Language", kurz Perl, zu erfinden:
Code:
#!/usr/bin/perl
use warnings; use strict;
use utf8; binmode STDOUT, ":utf8";

my $fh; my $i; 

open($fh, "<", "somefile.txt");
my @a = <$fh>;
close($fh);

foreach $i (@a) {
    print "$i\n";
}

# Oder wenn die Ausgabe erstmal C-artiger geschrieben werden soll:

for ($i = 0; $i <= $#a; $i++) {
    print "$a[$i]\n";
}
;)
 
Danke, aber das hilft mir nur begrenzt. :/
Kann man den Code nicht ändern damit es funktioniert oder ist das ein Grundlegendes Problem in C?
 
Natürlich kann man auch mit C Dateien einlesen. "cat" und andere machen das ja z.B.. Hier wäre z.B. eine solche Funktion:

http://www.programmingsimplified.com/c-program-read-file

Nur, wenn Du Dich (wie ich) mit malloc() nicht anfreunden kannst, wirst Du auch an der Weiterverarbeitung des Ergebnisses einer solchen Funktion keine Freude haben.
Warum muß es denn C sein? Hackst Du in einem bestehenden C-Code 'rum?
 
Ein kleiner Tipp am Rande:

Du allozierst Speicher, ohne jegliche Überprüfungen, z.B. wie groß die Datei ist. Das kann und wird nicht gut gehen. Du kannst ja mal vesuchen eine 4GB große Datei auf einmal zu laden wenn du nur 1GB RAM zur Verfügung hast. Es fehlt zusätzlich eine Prüfung, ob die Datei überhaupt geöffnet werden konnte.
 
A

Anonymous

Gast
Wenn man in C ein bisschen mehr als nur "hello_world.c" schreiben will, sollte man eine anständige IDE verwenden.
Dort würdest du wahrscheinlich ganz schnell feststellen, dass es dort in den Integer Typen durchaus ein paar mehr Unterschiede gibt, als du dir auf den ersten Blick erträumen würdest.

ohne mich jetzt mit deinem Problem näher zu beschäftigen, würde ich aus ein bischen C Programmiererfahrung heraus vermuten:
Dein attribut.st_size sollte entweder vom Type off_t bzw off64_t sein

und malloc erwartet garantiert aber einen Type size_t

meine Vermutung: size_t ist in aller letzter Konsequenz ein __SWORD_TYPE also eigentlich int
und off_t ein __SLONGWORD_TYPE also long int
und off64_t bestimmt zwangsläufig ein __SQUAD_TYPE also long long int

je nachdem was du jetzt für ein System genau vor dir hast, wirst du damit wenn du hier schlampig einfach blind das eine dem anderem zuordnest die eine oder andere Überraschung erleben, da diese Typen nicht zwangsläufig auf jedem System gleich sind, bzw überhaupt nicht gleich sind. (selbstverständlich alles schöne Laufzeitfehler, die man auch gar nicht so schnell findet.)
Einfach auch mal beim Kompilieren mit "-Wall" arbeiten und sich so anschauen was man alles so schön schlampig programmiert hat. ;)

robi
 
A

Anonymous

Gast
abgdf schrieb:
robi, jetzt hast Du xcatpc endgültig verschreckt. :D

glaube ich nicht.
C Programmierer sind zähe Burschen die so schnell nicht aufgeben auch wenn das Problem mal extrem widerspenstig ist ;) ;) ;)

robi
 
Oben