• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Wir haben den Frühjahrsputz beendet, Ihr auch? Welches Foto zu dem Thema hat Euch dann am Besten gefallen? Hier geht es lang zur Abstimmung --> Klick

Xcode - #C - Einlesen eine .txt Datei // while (!feof(f)) - build failed

DiKay90

Erdapfel
Registriert
02.11.12
Beiträge
4
Hallo, habe ein Problem bei einem eifnachen Programm zum einlesen einer Textdatei.

wir haben von unserem Informatik Professor folgenden Code in einem Skript bekommen:
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    char line[1000];
    
    FILE *f;
    f = fopen("i.txt","r");
    
    while (!feof(f)) {
        fgets(line,1000,f);
        printf("%s",line);
    }
    return 0;
}

Beim ausführen des Programms taucht jedoch ein Fehler aus, aber irgendwie nur unter Xcode. Beim Windows-PC funktioniert das Programm.

Als Fehler wird mir folgendes angezeigt:

0x7fff99905926: movzwl 16(%r14), %ebx

Thread 1: EXC_BAD_ACCESS(code=1, adress=0x10)

Eh die Frage kommt: die Datei i.txt ist erstellt mit Inhalt und liegt im gleichen Verzeichnis wie die #C-Datei.

Jemand ne Idee woran das liegen kann bzw. ob ich noch irgendwelche Einstellungen vornehmen muss?

Gruß, Danny
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.574
Eh die Frage kommt: die Datei i.txt ist erstellt mit Inhalt und liegt im gleichen Verzeichnis wie die #C-Datei.

Genau das ist aber mit Sicherheit der Fehler, denn das Programm ist so stark vereinfacht, dass es sofort abstürzt, wenn die Datei nicht an der richtigen Stelle liegt. (Nebenbei: Es gibt kein "'#C". Du meinst vielleicht "C#", aber das Programm ist in "C" geschrieben.)

Wo die C-Datei liegt, spielt keine Rolle. Du musst entweder dafür sorgen, dass das ausführbare Programm im gleichen Ordner liegt wie die i.txt-Datei, oder Du musst den Dateinamen im Programm auf den vollen Pfadnamen ändern, also z.B. etwas wie

... fopen("/Users/DiKay90/Documents/i.txt","r") ...

verwenden. Um das Programm absturzsicher zu machen, könntest Du nach der fopen-Zeile etwas wie

Code:
if (! f) return 1;

einfügen. Dann macht das Programm einfach "nichts", wenn die Datei an der falschen Stelle steht.
 

DiKay90

Erdapfel
Registriert
02.11.12
Beiträge
4
Alles klaro!

... Also mit dem absoluten Pfad funktioniert alles einwandfrei.

Nur warum gehts nicht mit dem relativen Pfad? muss ich noch was davor schreiben? ... hab keine Lust jedes mal den vollen Pfad da einzuhacken ^^
 

Bananenbieger

Golden Noble
Registriert
14.08.05
Beiträge
25.515
Die Executable sollte im gleichen Verzeichnis liegen wie die .txt

Ansonsten kannst Du auch mal "./i.txt" versuchen.
 

DiKay90

Erdapfel
Registriert
02.11.12
Beiträge
4
Hab die Lösung!

Das Problem scheinen wohl die Standard-Pfade vom Mac zu sein, deshalb ist es notwendig den Programmpfad vorher festzulegen...
anschließend kann man von dort aus mit relativen Pfaden weiterarbeiten.

Schade, dass es scheinbar keine einfachere Variante gibt. ... Oder kennt noch jemand eine?

http://lists.apple.com/archives/xcode-users/2012/Jul/msg00037.html

Code:
#include <stdio.h>
#include <stdlib.h>
#include <libc.h>   //für die Funktion chdir - Zur Änderung des aktuellen Pfades


int main(int argc, char *argv[])
{
    chdir("/Users/dikay90/Documents/Programmierung/C/Einlesen_eines_Files/");
    //Ändern des aktuellen Arbeitspfades (da unter Mac mit Xcode) - Infos: [URL]http://lists.apple.com/archives/xcode-users/2012/Jul/msg00037.html[/URL]


    int feof(FILE *stream);
    char line[1000];
    
    FILE *f;
    f = fopen("i.txt","r");
    
    if (! f) {              //falls Fehler beim Datei laden.
        printf("Datei nicht vorhanden!");
        return 1;
    }
    
    while (!feof(f)) {
        fgets(line,1000,f);
        printf("%s",line);
    }
    return 0;
}
 

Bananenbieger

Golden Noble
Registriert
14.08.05
Beiträge
25.515
Ich sehe da kein Problem ;)

Du hast wahrscheinlich beim Kompilieren die Binary in eines der bin-Verzeichnisse bzw. PATH-Verzeichnisse legen lassen - Was im Grunde auch eigentlich fast immer so gewollt ist. Dort liegt aber Deine i.txt nicht.

Beginnt der Befehl mit dem Du Dein Programm aufrufst mit ./ ?

Ein schnödes gcc deinequelldatei.c schmeisst Dir im gleichen Verzeichnis eine a.out aus, die Du dort mit ./a.out ausführen kannst. Dein Programmcode aus dem Eingangspost funktioniert einwandfrei, wenn Du es so machst.

Für den Anfang ist es meist einfacher nicht gleich in einer hochkomplexen Umgebung wie Xcode zu arbeiten. :)
 

Marcel Bresink

Hadelner Sommerprinz
Registriert
28.05.04
Beiträge
8.574
Das Problem scheinen wohl die Standard-Pfade vom Mac zu sein, deshalb ist es notwendig den Programmpfad vorher festzulegen... anschließend kann man von dort aus mit relativen Pfaden weiterarbeiten.

Nein, das ist unter Windows exakt genauso.

Aber wie ich schon ganz am Anfang geschrieben habe, muss das ausführbare Programm (auf englisch "Exectuable", das ist in Windows die Datei mit dem ".EXE") im gleichen Ordner liegen, wie die i.txt-Datei. Das ist bei Dir nicht der Fall. Bei Dir liegt nur die C-Datei und die Unix-Dokumentationsdatei (das ist die mit der ".1") im Ordner.