2016-04-14 3 views
2

Ich lerne, freopen() zu verwenden, um stdin in eine Datei umzuleiten.Kann Datei nicht öffnen, die relativen Pfad in Freopen() unter OS X verwendet?

Ich bin unter OS X 10.10 und ich verwende Xcode, um meinen Code auszuführen.

Hier ist mein Code:

#include <stdio.h> 

int main(int argc, const char * argv[]) { 
    freopen("../data.in", "r", stdin); 
    char a; 
    scanf("%c", &a); 
    fclose(stdin); 
    printf("%c", a); 
    return 0; 
} 

EDIT I tree Befehl in Terminal verwenden Dateistruktur zu zeigen, und der Ausgang ist

. 
├── competition 
│   └── main.c 
├── competition.xcodeproj 
│   ├── project.pbxproj 
│   ├── project.xcworkspace 
│   │   ├── contents.xcworkspacedata 
│   │   ├── xcshareddata 
│   │   │   └── competition.xccheckout 
│   │   └── xcuserdata 
│   │    └── yang.xcuserdatad 
│   │     └── UserInterfaceState.xcuserstate 
│   └── xcuserdata 
│    └── yang.xcuserdatad 
│     ├── xcdebugger 
│     │   └── Breakpoints_v2.xcbkptlist 
│     └── xcschemes 
│      ├── competition.xcscheme 
│      └── xcschememanagement.plist 
├── data.in 
└── makefile 

ich auch die Ausgabe von freopen() überprüfen haben. Die Funktion hat NULL zurückgegeben.

Ich habe nichts während Ich bekam korrekte Ausgabe, als ich "../data.in" zum absoluten Pfad änderte.

Wie kann ich es mit relativen Pfaden beheben?

+0

Dieses Problem konnte nicht reproduziert werden. Sind Sie sicher, dass dies kein Problem mit dem Dateinamen ist? – sjsam

Antwort

2

Um einen relativen Pfad zu verwenden, müssen Sie wissen, was das aktuelle Verzeichnis Ihres laufenden Prozesses ist.

Siehe getcwd().

Wenn Sie das Programm über eine Befehlszeile starten, entspricht das aktuelle Verzeichnis der Befehlszeile eins. In der Befehlszeile (sh, bash ...) wird der Befehl pwd Ihnen sagen, wo Sie sind.

Wenn Sie das Programm von einem Debugger starten, wählt der Debugger das Startverzeichnis des Programms, dies sollte eine Option Ihres Debuggers sein.

+0

Wie Sie bereits gesagt haben, ändert Xcode das Debug-Arbeitsverzeichnis in '~/Library/Developer/Xcode/DerivedData/project-/Build/Products/Debug '. Durch Anpassen des Arbeitsverzeichnisses wird alles ordnungsgemäß ausgeführt. –

+0

Sie können http://StackOverflow.com/questions/3396378/change-the-working-directory-in-xcode zum Ändern des Arbeitsverzeichnisses –

3

Der relative Pfad hat keinen Bezug zur Quelle des Programms. Es ist eigentlich relativ zum "aktuellen Arbeitsverzeichnis" (im Grunde geben Sie pwd in Ihrem Shell-Fenster ein, um zu sehen, was Ihr Arbeitsverzeichnis ist, dann führen Sie das Programm aus, wenn es eine Datei in ../data.in gibt, wird es funktionieren, sonst werden Sie wahrscheinlich alle Arten bekommen von seltsamen Fehlern).

Sie sollten auch den Rückgabewert von freopen überprüfen, wenn es NULL zurückgibt, trat ein Fehler auf und Sie sollten wahrscheinlich damit umgehen.

+0

Ich habe die Frage bearbeitet und meine Projektstruktur hinzugefügt. Ich habe versucht, 'pwd' zu benutzen, um mir zu helfen, aber vergeblich. Ich denke nicht, dass irgendetwas mit dem Pfad falsch ist, weil die Datei 'data.in' im übergeordneten Verzeichnis von' main.c' existiert. Könnten Sie mir bitte einen Hinweis geben? –

+0

Nun, ich habe es herausgefunden. Es ist das Arbeitsverzeichnis, das von 'Xcode' festgelegt wurde, das zu dem Problem führte. Genau wie @purplepsycho erwähnt. In Xcode ist das Standard-Debug-Arbeitsverzeichnis '~/Library/Developer/Xcode/DerivedData/project-/Build/Products/Debug '. Nachdem ich das Arbeitsverzeichnis angepasst habe, hat alles gut funktioniert. –

Verwandte Themen