ubuntuusers.de

Datei unter C öffen

Status: Gelöst | Ubuntu-Version: Lubuntu 12.10 (Quantal Quetzal)
Antworten |

drhawo

Anmeldungsdatum:
6. September 2010

Beiträge: 159

Hallo,

ich beschäftige mich seit kurzem mit C, habe damit viel Spass aber auch Anfängerprobleme, die beim Geübten wahrscheinlich nur Schmunzeln auslösen.

Als Entwicklungsumgebung verwende ich Anjuta, nebenbei gesagt suche ich auch nach einer umfassenden Hilfe für dieses Programm, möglichst in deutsch.

Das akute Problem ist das Öffnen einer Textdatei aus meinem Home-Verzeichnis. Ich habe es mit folgenden Code probiert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
   FILE *d;
 
   d = fopen("/home/hans/dat", "r");
   if( d == NULL )
   {
      printf("Konnte Datei nicht öffnen!\n");
      return EXIT_FAILURE;
   }
   fclose(d)
   return EXIT_SUCCESS;
}

Der Code wird fehlerfrei erstellt aber nicht ausgeführt. Es kommt sofort die Meldung:

Program has been terminated receiving signal 11 (Segmentation fault)

Die Datei existiert in meinem Heimatverzeichnis und kann mit einem Editor geöffnet werden.

hans@re:~$ ls -l dat
-rw-rw-r-- 1 hans hans 742 Apr 22 21:03 dat

Vielleicht kann mir jemand weiter helfen, wäre ja nicht das erstemal.

MfG drhawo

Bearbeitet von rklm:

Bitte die passenden Syntaxhighligher benutzen.

Inkane

Anmeldungsdatum:
17. Oktober 2010

Beiträge: 306

drhawo schrieb:

Der Code wird fehlerfrei erstellt aber nicht ausgeführt. Es kommt sofort die Meldung:

Also wenn das Programm dem Code aus dem Beispiel entspricht, dann stimmt das so nicht:

 clang test.c
test.c:14:13: error: expected ';' after expression
   fclose(d)

Mit dem zusätzlichen Semikolon funktioniert es bei mir eigentlich wie erwartet.

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Hallo

In deinem Programm sitzt ein typischer C Anfängerfehler.

Sieh dir mal an was passiert wenn die Datei nicht geöffnet werden kann.

cu

drhawo

(Themenstarter)

Anmeldungsdatum:
6. September 2010

Beiträge: 159

Hallo,

danke für die prompte Antwort.

Das Semikolon fehlte nicht im Original und dennoch funktionierte der Code nicht. Als ich ihn jedoch heute morgen neuerlich in unverändeter Form ausprobierte war da nichts mehr von einer Fehlermeldung. Ich kann es mir nicht erklären, spielt aber wohl keine Rolle mehr.

Gruß drhawo.

drhawo

(Themenstarter)

Anmeldungsdatum:
6. September 2010

Beiträge: 159

Hallo Microft,

habe deinem Vorschlag entsprechend den Dateinamen geändert, sodass ein Öffnen nicht mehr möglich war. Das Programm zeigte jedoch korrekt mit "dat konnte nicht geöffnet werden" das Fehlen der Datei an.

Ich kann also den "typ. Anfängerfehler" nicht finden und das macht mich neugierig. Vielleicht könntest du mir noch einen weiteren Wink geben wonach ich suchen muss.

Drhawo.

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

hallo

Klarer Fall von Glück gehabt.

Wenn deine Datei nicht geöffnet werden kann ist dein Filepointer NULL. Anschließend machst du dann eine close(NULL). Sowas ist der Hauptgrund für segfaults. Niemals nicht Tun, Pfui baba 😉

1
2
3
4
5
6
7

if ( d = fopen("hsfkjafhkajhsf","r") )
   {
   mach irgend was

   fclose(d) ;
   }

So ists besser.

cu

drhawo

(Themenstarter)

Anmeldungsdatum:
6. September 2010

Beiträge: 159

Hallo Microft,

ich wusste es ja, aber immer wieder stoße ich an meine Grenzen, die Logik ist und bleibt das A & O des Programmierens. Danke drhawo.

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Grenzen sind dazu da, dagegen zu rennen.

Der Mensch lernt durch Schmerzen.

cu

FromBodom

Avatar von FromBodom

Anmeldungsdatum:
6. April 2009

Beiträge: 74

Wohnort: Berlin

Hi, da du ja auch nach infos gefragt hattest kann ich dir das c script von meinem ehemaligem lnf. Dozenten empfehlen ist ein schöner einstieg in c http://public.beuth-hochschule.de/~kempfer/

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

FromBodom schrieb:

Hi, da du ja auch nach infos gefragt hattest kann ich dir das c script von meinem ehemaligem lnf. Dozenten empfehlen ist ein schöner einstieg in c http://public.beuth-hochschule.de/~kempfer/

Dem schließe ich mich an. Einfach klar und mit Beispielen. Leider selten im Netz.

Als Anmerkung wäre hier noch UTF zu nennen. Das verarbeiten von Strings ist sehr viel aufwendiger geworden.

Die man für die c-lib findst du hier http://manpages.ubuntu.com/manpages/lucid/de/man3/

Damit du dir nicht die Finger wund tippst, gibts noch ne gute Lib https://developer.gnome.org/glib/2.34/

cu

Vain

Avatar von Vain

Anmeldungsdatum:
12. April 2008

Beiträge: 2510

microft schrieb:

Wenn deine Datei nicht geöffnet werden kann ist dein Filepointer NULL. Anschließend machst du dann eine close(NULL).

Wo denn? Wenn „d“ gleich „NULL“ ist, geht er ins „if“ und verlässt von dort aus „main“. Zum „fclose()“ kommt er gar nicht.

Muss allerdings gestehen, dass ich in dem Code gerade auch keinen Grund für einen Segfault sehe.

microft

Avatar von microft

Anmeldungsdatum:
6. August 2009

Beiträge: 454

Wohnort: Norddeutschland

Vain schrieb:

microft schrieb:

Wenn deine Datei nicht geöffnet werden kann ist dein Filepointer NULL. Anschließend machst du dann eine close(NULL).

Wo denn? Wenn „d“ gleich „NULL“ ist, geht er ins „if“ und verlässt von dort aus „main“. Zum „fclose()“ kommt er gar nicht.

Hast natürlich recht. Hab den return überlesen.

Hab nur den typischen Aufbau für so einen Fehler gesehen.

cu

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

FromBodom schrieb:

Hi, da du ja auch nach infos gefragt hattest kann ich dir das c script von meinem ehemaligem lnf. Dozenten empfehlen ist ein schöner einstieg in c http://public.beuth-hochschule.de/~kempfer/

Also Script zu C++ fängt zumindest schaurig an:

C++ ist eine Weiterentwicklung von C (genau genommen von ANSI-C). D.h. C-Programme >können von C++-Compiler übersetzt werden; es können auch die Standard-Bibliotheken >von C verwendet werden. Allerdings lassen sich nicht immer C-Programme 1:1 in C++ >übernehmen, da es einige kleine Änderungen und Unterschiede gibt. Auf diese >Unterschiede wird in diesem Kapitel eingegangen.

Seit Ende 2000 ist von einem Nachfolger von C++ die Rede: C# (Cis oder C Sharp >(Anspielung auf "see sharp", schärfer sehen)). Dabei wird die Raute als zwei >übereinander gesetzte ++ interpretiert. Dabei ist C#, Microsofts neueste >objektorientierte Programmiersprache, keine Erweiterung von C, sondern eine >Neuentwicklung. Sie steht in direkter Konkurrenz zu Java: Neben der >Plattformunabhängigkeit ist sie in eine sprachunabhängige (aber firmenabhängige!) >Umgebung eingebettet. In C# geschriebene Programme können sehr einfach mit >Programmen - geschrieben in Visual Basic, JScript oder in C++ - kommunizieren. Dies >wurde erreicht, indem für C# keine eigenen Standardbibliotheken entwickelt wurden, >sondern sie wurde in die neu entwickelte Infrastruktur .NET von Microsoft >eingebettet, die auch weitere Sprachen unterstützt.

Auch wenn das wenig mit dem eigentlichen Programmierteil zu tun hat, lässt es *schlimmes* befürchten, denn Präzision und auch inhaltliches Halbwissen sind beim Programmieren schädlich.

Am Anfang eines solchen Tutorials erwarte ich eher den Satz:

C++ hat mit C *nichts* zu tun und ist eine *eigenständige* Sprache.

Im Tutorial geht es dann auch gleich mit printf los... Hu? WTF! Ok, wenn man die Einleitung so verinnerlicht hat, verwundert es einen nicht - leider idiomatisch falsch!

Ich mag den "klassischen" Aufbau des Scripts nicht. Da wird beim Thema OOP mal wieder viel zu doll und schnell auf das Thema Vererbung mit alle seinen Facetten geblickt. Dass eine Vererbung immer eine "Ist ein"-Beziehung ausdrückt und man viel öfter eine "Hat ein"-Bezieung hat, wird wieder einmal nicht erwähnt. Dafür kommen dann Sachen wie abstract, virtual und auch das Thema Casten *viel* zu kurz und zu spät. Auch Polymorphismus ist imho ein so wesentliches Element, dass es viel mehr Aufmerksamkeit bedürfte.

Genau genommen gehören die Grundsätze der OOP a la "SOLID" imho unbedingt in so ein Script; genauso wie die grundlegenden Container-Typen der STL. Dass vector als "neuer Datentyp" für Arrays vorgestellt wird, führt den Lernenden imho in eine falsche Richtung.

Ganz im Ernst: Ich halte davon wenig. Es ist eine viel zu ausufernde, dafür inhaltlich aber zu kurze Abhandlung der typischen "Sprach"-Bücher. Viel besser aufgebaut ist z.B. das Yellow Book von Rob Miles. Ist zwar C#, aber alleine beim Überfliegen sieht man, wie er geschickt durchgängige Beispiele benutzt, um dem Lernenden Stück für Stück wichtige Konzepte näher zu bringen. Ich kenne etwas analoges für C++ leider nicht - vielleicht ja jemand anderes?

drhawo

(Themenstarter)

Anmeldungsdatum:
6. September 2010

Beiträge: 159

Hallo,

wollte den Thread gleich nach der Lösung meines Problem abschließen und bin jetzt froh, dass ich es nicht getan habe. Es kamen noch viele nützliche Ergänzungen und ich bedanke mich ganz herzlich, drhawo.

Antworten |