Feedback C-Tutorial - Files

Diskussionen zu Tutorials, Änderungs- und Erweiterungswünsche
Antworten
abap_true
Beiträge: 25
Registriert: Di Feb 05, 2013 1:38 pm
Wohnort: Köln

Feedback C-Tutorial - Files

Beitrag von abap_true » Fr Mär 22, 2013 2:12 pm

Punkt1:

Code: Alles auswählen

#include <stdio.h>
 
int main (void)
{
  FILE *file = fopen( "datei.txt", "a" );
 
  if( file )
  {
    long int size = ftell( file );
    printf( "Wir befinden uns an Position %ld, die Datei ist %ld Byte groß.\n", size, size );
 
    fclose(file);
  }
  else
    printf( "Datei konnte nicht geöffnet werden.\n" );
 
  return 0;
}
In diesem Beispiel iritiert der Else-Zweig. Er wird durch das "a" beim fopen nie durchlaufen. Ich habe mich gewundert warum das Programm bei der Angabe blödsinniger Dateinamem nie in den Else-Zweig gelaufen ist und hab mich auch gefragt wie man dem Pointer im Debugger von CodeBlocks ansieht, ob er auf etwas zeigt, oder nicht. Dann habe ich das Tutorial gründlich weitergelesen und siehe da: "a" bedeutet, wenn die Datei nicht existiert, wird sie von fopen() angelegt.
Nun ja, im Ergebnis weiss ich jetzt aber wie ein Zeiger im Debugger aussieht, wenn er auf nichts zeigt (0x0) und habe festgestellt, dass alle Dateien die ich vorher noch mit "a" ausprobiert habe, zwar nicht auf der Festplatte liegen (klar hab ja nichts zurück geschrieben) aber immer noch im Arbeitsspeicher rumlungern.

Punkt 2:
Die Kombination von ftell() und fseek() lässt uns zum Ende der Datei springen und dort fragen, wo wir gerade sind. Wir können so zum Beispiel mit dem Modus „r“ beim Öffnen mittels fopen() und an das Ende der Datei setzen lassen und dann fragen, wo wir eigentlich sind. Anschließend - um die Datei lesen zu können, setzen wir uns mit fseek() wieder zurück an den Anfang:

Hier ist wohl was beim Satzbau schiefgelaufen :-)

abap_true
Beiträge: 25
Registriert: Di Feb 05, 2013 1:38 pm
Wohnort: Köln

Re: Feedback C-Tutorial - Files

Beitrag von abap_true » Fr Mär 22, 2013 2:20 pm

wie bekommen ich eigentlich meinen Arbeitsspeicher wieder sauber (ohne den Rechner auszuschalten)?
Ich habe scheinbar immer noch eine datei.txt mit 0Byte im Speicher und bekomme die richtige von der Platte nicht geöffnet :-(

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Feedback C-Tutorial - Files

Beitrag von nufan » Fr Mär 22, 2013 2:34 pm

abap_true hat geschrieben:In diesem Beispiel iritiert der Else-Zweig. Er wird durch das "a" beim fopen nie durchlaufen.
Doch, wird er. Zum Beispiel wenn du am angegebenen Ort keine Schreibrechte hast oder du ungültige Zeichen im Dateinamen verwendest.
abap_true hat geschrieben:[...] und habe festgestellt, dass alle Dateien die ich vorher noch mit "a" ausprobiert habe, zwar nicht auf der Festplatte liegen (klar hab ja nichts zurück geschrieben) aber immer noch im Arbeitsspeicher rumlungern.
Wie meinst du das? Du bekommst die Zeiger im Debugger angezeigt, aber es gibt die Dateien nicht auf der Festplatte?
abap_true hat geschrieben:Hier ist wohl was beim Satzbau schiefgelaufen :-)
Joa ich werde das etwas einfacher formulieren ^^
abap_true hat geschrieben:wie bekommen ich eigentlich meinen Arbeitsspeicher wieder sauber (ohne den Rechner auszuschalten)?
Warum willst du das? Um die "Dateien im RAM" zu löschen? Ich glaub eher das Problem liegt wo anders... außerdem sollte das das Betriebssystem auch schon von allein machen.

Interessant dazu:
http://security.stackexchange.com/quest ... emory-safe

abap_true
Beiträge: 25
Registriert: Di Feb 05, 2013 1:38 pm
Wohnort: Köln

Re: Feedback C-Tutorial - Files

Beitrag von abap_true » Fr Mär 22, 2013 3:13 pm

dani93 hat geschrieben:
abap_true hat geschrieben:In diesem Beispiel iritiert der Else-Zweig. Er wird durch das "a" beim fopen nie durchlaufen.
Doch, wird er. Zum Beispiel wenn du am angegebenen Ort keine Schreibrechte hast oder du ungültige Zeichen im Dateinamen verwendest.
OK, ich habe es nur mit nicht existenten Dateinamen probiert
dani93 hat geschrieben:
abap_true hat geschrieben:[...] und habe festgestellt, dass alle Dateien die ich vorher noch mit "a" ausprobiert habe, zwar nicht auf der Festplatte liegen (klar hab ja nichts zurück geschrieben) aber immer noch im Arbeitsspeicher rumlungern.
Wie meinst du das? Du bekommst die Zeiger im Debugger angezeigt, aber es gibt die Dateien nicht auf der Festplatte?
Yepp, ich habe eine Referenz im Zeiger für nicht vorhandene Dateien.
dani93 hat geschrieben:
abap_true hat geschrieben:wie bekommen ich eigentlich meinen Arbeitsspeicher wieder sauber (ohne den Rechner auszuschalten)?
Warum willst du das? Um die "Dateien im RAM" zu löschen? Ich glaub eher das Problem liegt wo anders... außerdem sollte das das Betriebssystem auch schon von allein machen.
Ja das Problem liegt wahrscheinlich woanders. Ich konnte nicht unertscheiden ob ich die Datei auf der Festplatte geöffnet und die Größe falsch ermittelt habe, oder ob ich die leere Datei aus dem Speicher am Wickel hatte.
Jetzt habe ich die Datei aus dem Ordner mit dem Programm verschoben und greife mit Pfadangabe darauf zu und das klappt.

nufan
Wiki-Moderator
Beiträge: 2558
Registriert: Sa Jul 05, 2008 3:21 pm

Re: Feedback C-Tutorial - Files

Beitrag von nufan » Fr Mär 22, 2013 3:16 pm

abap_true hat geschrieben:
dani93 hat geschrieben:
abap_true hat geschrieben:[...] und habe festgestellt, dass alle Dateien die ich vorher noch mit "a" ausprobiert habe, zwar nicht auf der Festplatte liegen (klar hab ja nichts zurück geschrieben) aber immer noch im Arbeitsspeicher rumlungern.
Wie meinst du das? Du bekommst die Zeiger im Debugger angezeigt, aber es gibt die Dateien nicht auf der Festplatte?
Yepp, ich habe eine Referenz im Zeiger für nicht vorhandene Dateien.
Dann solltest du die Zeiger aus der Debugger-Ansicht rauslöschen.
abap_true hat geschrieben:
dani93 hat geschrieben:
abap_true hat geschrieben:wie bekommen ich eigentlich meinen Arbeitsspeicher wieder sauber (ohne den Rechner auszuschalten)?
Warum willst du das? Um die "Dateien im RAM" zu löschen? Ich glaub eher das Problem liegt wo anders... außerdem sollte das das Betriebssystem auch schon von allein machen.
Ja das Problem liegt wahrscheinlich woanders. Ich konnte nicht unertscheiden ob ich die Datei auf der Festplatte geöffnet und die Größe falsch ermittelt habe, oder ob ich die leere Datei aus dem Speicher am Wickel hatte.
Jetzt habe ich die Datei aus dem Ordner mit dem Programm verschoben und greife mit Pfadangabe darauf zu und das klappt.
Sicher, dass nicht ein einfaches Aktualisieren über F5 im Datei-Browser gereicht hätte? Zeigt dir "ls" in der Konsole die Dateien an?

abap_true
Beiträge: 25
Registriert: Di Feb 05, 2013 1:38 pm
Wohnort: Köln

Re: Feedback C-Tutorial - Files

Beitrag von abap_true » Fr Mär 22, 2013 4:13 pm

Ich habe die Dateien ja gar nicht weggeschrieben, sie sind also nicht auf der Platte vorhanden. Ich habe einfach Probleme Dateien ohne komplette Pfadangabe zu lesen. Aber das ist nicht tragisch, jetzt möchte ich die Datei erstmal zeilenweise verarbeiten und zum guten Schluss in eine Datenbank schreiben.

PS: mit dem Debugger von CodeBlocks stehe ich noch auf Kriegsfuss, ich glaube ein eclipse wäre mir lieber aber dann muss ich auf dieser blöden Windows Kiste erstmal irgendwie nen C-Compiler installieren...(ohne Admin Rechte)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Feedback C-Tutorial - Files

Beitrag von Xin » Fr Mär 22, 2013 4:59 pm

abap_true hat geschrieben:Ich habe mich gewundert warum das Programm bei der Angabe blödsinniger Dateinamem nie in den Else-Zweig gelaufen ist und hab mich auch gefragt wie man dem Pointer im Debugger von CodeBlocks ansieht, ob er auf etwas zeigt, oder nicht. Dann habe ich das Tutorial gründlich weitergelesen und siehe da: "a" bedeutet, wenn die Datei nicht existiert, wird sie von fopen() angelegt.
Nun ja, im Ergebnis weiss ich jetzt aber wie ein Zeiger im Debugger aussieht, wenn er auf nichts zeigt (0x0) und habe festgestellt, dass alle Dateien die ich vorher noch mit "a" ausprobiert habe, zwar nicht auf der Festplatte liegen (klar hab ja nichts zurück geschrieben) aber immer noch im Arbeitsspeicher rumlungern.
Und wie hast Du das festgestellt?
abap_true hat geschrieben:Punkt 2:
Die Kombination von ftell() und fseek() lässt uns zum Ende der Datei springen und dort fragen, wo wir gerade sind. Wir können so zum Beispiel mit dem Modus „r“ beim Öffnen mittels fopen() und an das Ende der Datei setzen lassen und dann fragen, wo wir eigentlich sind. Anschließend - um die Datei lesen zu können, setzen wir uns mit fseek() wieder zurück an den Anfang:

Hier ist wohl was beim Satzbau schiefgelaufen :-)
Danke für den Hinweis, ich habe den Satz mal sinnvoller umformuliert :-)
abap_true hat geschrieben:wie bekommen ich eigentlich meinen Arbeitsspeicher wieder sauber (ohne den Rechner auszuschalten)?
Ich habe scheinbar immer noch eine datei.txt mit 0Byte im Speicher und bekomme die richtige von der Platte nicht geöffnet :-(
Eine Datei liegt auf der Festplatte, da nutzt Ausschalten nichts. Die musst Du löschen.
Im Arbeitsspeicher gibt es keine Dateien.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

abap_true
Beiträge: 25
Registriert: Di Feb 05, 2013 1:38 pm
Wohnort: Köln

Re: Feedback C-Tutorial - Files

Beitrag von abap_true » So Mär 24, 2013 1:31 pm

Xin hat geschrieben:
abap_true hat geschrieben:Ich habe mich gewundert warum das Programm bei der Angabe blödsinniger Dateinamem nie in den Else-Zweig gelaufen ist und hab mich auch gefragt wie man dem Pointer im Debugger von CodeBlocks ansieht, ob er auf etwas zeigt, oder nicht. Dann habe ich das Tutorial gründlich weitergelesen und siehe da: "a" bedeutet, wenn die Datei nicht existiert, wird sie von fopen() angelegt.
Nun ja, im Ergebnis weiss ich jetzt aber wie ein Zeiger im Debugger aussieht, wenn er auf nichts zeigt (0x0) und habe festgestellt, dass alle Dateien die ich vorher noch mit "a" ausprobiert habe, zwar nicht auf der Festplatte liegen (klar hab ja nichts zurück geschrieben) aber immer noch im Arbeitsspeicher rumlungern.
Und wie hast Du das festgestellt?
Nun ja, nicht existierende Dateien die ich mit FILE *file = fopen( "datei22.txt", "a" ); mal versucht habe zu öffnen, um in den Else-Zweig zu gelangen, lieferten mir beim FILE *file = fopen( "datei.txt", "r" ); immer noch einen Zeiger zurück. Während ich für Dateinnamem die ich vorher noch nicht benutzt habe mit FILE *file = fopen( "datei23.txt", "r" ); endlich in den Else-Zweig gelangte. Daraus habe ich messerscharf geschlossen, dass ich mit FILE *file = fopen( "datei22.txt", "a" ); einen Datei-Handle erzeugt habe, der immer noch im Arbeitspeicher vorhanden ist.
Xin hat geschrieben:
abap_true hat geschrieben:wie bekommen ich eigentlich meinen Arbeitsspeicher wieder sauber (ohne den Rechner auszuschalten)?
Ich habe scheinbar immer noch eine datei.txt mit 0Byte im Speicher und bekomme die richtige von der Platte nicht geöffnet :-(
Eine Datei liegt auf der Festplatte, da nutzt Ausschalten nichts. Die musst Du löschen.
Im Arbeitsspeicher gibt es keine Dateien.
Hab mich hier unklar ausgedrückt. Die Datei existiert gar nicht, es handelt sich wohl um den Datei-Handle.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Feedback C-Tutorial - Files

Beitrag von Xin » So Mär 24, 2013 3:03 pm

abap_true hat geschrieben:
Xin hat geschrieben:
abap_true hat geschrieben:Ich habe mich gewundert warum das Programm bei der Angabe blödsinniger Dateinamem nie in den Else-Zweig gelaufen ist und hab mich auch gefragt wie man dem Pointer im Debugger von CodeBlocks ansieht, ob er auf etwas zeigt, oder nicht. Dann habe ich das Tutorial gründlich weitergelesen und siehe da: "a" bedeutet, wenn die Datei nicht existiert, wird sie von fopen() angelegt.
Nun ja, im Ergebnis weiss ich jetzt aber wie ein Zeiger im Debugger aussieht, wenn er auf nichts zeigt (0x0) und habe festgestellt, dass alle Dateien die ich vorher noch mit "a" ausprobiert habe, zwar nicht auf der Festplatte liegen (klar hab ja nichts zurück geschrieben) aber immer noch im Arbeitsspeicher rumlungern.
Und wie hast Du das festgestellt?
Nun ja, nicht existierende Dateien die ich mit FILE *file = fopen( "datei22.txt", "a" ); mal versucht habe zu öffnen, um in den Else-Zweig zu gelangen, lieferten mir beim FILE *file = fopen( "datei.txt", "r" ); immer noch einen Zeiger zurück. Während ich für Dateinnamem die ich vorher noch nicht benutzt habe mit FILE *file = fopen( "datei23.txt", "r" ); endlich in den Else-Zweig gelangte. Daraus habe ich messerscharf geschlossen, dass ich mit FILE *file = fopen( "datei22.txt", "a" ); einen Datei-Handle erzeugt habe, der immer noch im Arbeitspeicher vorhanden ist.
Mit "r" landest Du im else-Zweig, weil Du kein Filehandle erhalten hast -> es muss auch keins freigegeben werden.

Wenn Du im then-Zweig landest, darfst Du die Daten verwenden, Du bekommst ein FileHandle und das wird mit fclose() wieder geschlossen und freigegeben.

Der Zeiger (FILE *) ist danach ungültig, auch wenn er noch irgendwohin zeigt.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Antworten