J'utilise Windows dans un cours que j'ai suivi, mais j'essaie d'exécuter un code de base pour comprendre comment ouvrir/fermer/entrer/afficher des fichiers sur Xcode et le code que j'utilise habituellement dans les studios visuels. t travailler aucune idée pourquoi? Merci!
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
ifstream fin;
ofstream fout;
string input;
fin.open("inputFile.txt");
if(fin.fail())
cout << "File failed to open." << endl;
fin >> input;
fout.open("outputFile.txt");
fout << input;
}
Placez vos fichiers .txt dans le même répertoire que votre fichier main.cpp (ou n’importe où vous voulez).
Dans Xcode, sélectionnez Produit> Schéma> Modifier le schéma> Exécuter le test (à droite)> Options (milieu en haut).
Sous Options, cochez la case "Utiliser un répertoire de travail personnalisé" et réglez-le sur le répertoire dans lequel se trouvent vos fichiers .txt.
Pour travailler avec les fichiers, vous devez spécifier uniquement les noms de fichiers, par exemple. in_file.open ("inputFile.txt"); aucun chemin n'est nécessaire.
Voici une approche complètement différente: demandez à Xcode de copier le fichier d’entrée pour vous.
Maintenant, chaque fois que vous construisez votre projet, le fichier d'entrée sera copié dans le même dossier que l'exécutable, où qu'il soit construit. Bien sûr, pour voir le fichier de sortie, vous devez toujours trouver l'exécutable dans le Finder.
Les réponses n'expliquent pas vraiment le problème, alors j'ai pensé que je le ferais.
Lorsque vous transmettez un chemin relatif tel que "inputFile.txt" aux fichiers API, il est traité comme relatif au répertoire de travail lors de l'exécution du programme. Ceci est identique au "répertoire de travail" lorsque vous utilisez cmd.exe ou Terminal.app ou les lignes de commande en général. La commande Unix pwd
("répertoire de travail d'impression") affiche le répertoire de travail actuel. Sous Windows, la commande cd
sans argument remplit la même fonction. (Sous Unix, si vous exécutez cd
sans arguments, le répertoire de travail sera remplacé par le répertoire de base de l'utilisateur.)
Lorsque vous exécutez un programme à partir de la ligne de commande, la ligne de commande Shell définit le répertoire de travail du programme. Lorsque vous exécutez un programme depuis un IDE, le IDE définit le répertoire de travail. Depuis, contrairement à une ligne de commande, il n'y a pas de réponse évidente à ce que IDE = doit définir comme répertoire de travail, Visual Studio et Xcode définissent le répertoire de travail sur différents emplacements par défaut: Visual Studio définit le répertoire de travail sur $(ProjectDir)
, le répertoire contenant le fichier de projet Visual Studio; Xcode définit le répertoire de travail. répertoire dans le répertoire des produits de construction, c’est-à-dire l’emplacement dans lequel l’exécutable a été écrit.
Voici quelques solutions possibles à votre problème:
N'utilisez pas de chemin relatif et ne dépendez donc pas du répertoire de travail. Cela n’aidera pas beaucoup à rendre le programme plus portable, car les chemins absolus différeront également d’une plate-forme à une autre. Vous devrez donc toujours configurer le programme pour chaque plate-forme. En fait, utiliser un chemin absolu est pire, car cela signifie que votre code source doit être différent, alors qu'il serait préférable de limiter cette différence à la configuration de construction de chaque plate-forme.
Configurez le IDE pour utiliser votre répertoire de travail souhaité. Visual Studio peut être configuré en cliquant avec le bouton droit de la souris sur le projet, en sélectionnant Propriétés de configuration> Débogage> Répertoire de travail et en définissant le répertoire de travail sur le chemin souhaité (potentiellement. en utilisant des variables de construction Visual Studio).
réponse de nepete explique comment configurer le fonctionnement directement défini par Xcode.
Configurez le processus de construction de l'EDI pour copier vos fichiers de données dans un emplacement approprié. Dans Visual Studio, vous feriez cela dans un projet C++ en configurant les propriétés du projet> Propriétés de la configuration> Evénements de génération.
Réponse de SSteve explique comment configurer des étapes de construction supplémentaires dans Xcode.
Comme suggéré par nepete, éditez le schéma, mais utilisez $ PROJECT_DIR comme répertoire de travail personnalisé. Permet de déplacer le projet ou de travailler dans deux environnements différents (à la maison et au bureau, par exemple).
BTW. $ PROJECT_DIR est l’une des variables d’environnement Xcode et facilite également la transmission de noms de fichiers en tant qu’arguments de ligne de commande aux programmes (paramétrable sous "Arguments" dans le schéma).
Je suppose que vous avez inputFile.txt dans le dossier qui contient votre code source. Cela ne va pas au travail. Vous devez le placer dans le dossier contenant l'exécutable généré. Pour trouver ce dossier, cliquez avec le bouton droit de la souris sur votre application sous Produits et sélectionnez Afficher dans le Finder.
Cette image montre à quoi ça ressemble pour un programme en ligne de commande. Il montre également la fenêtre du Finder qui a été ouverte. Comme vous pouvez le constater, il s’agit d’un dossier différent de celui contenant le code source.
J'ai lutté avec le même problème aujourd'hui. Je voulais ajouter du code C à mon projet Swift) et mon pointeur de fichier était toujours NULL.
Malheureusement, dans XCode 9 pour application iOS, je ne pouvais pas changer le répertoire de travail. Changer les phases de construction ne m'a pas aidé non plus. Après plus de 4 heures d'essais et d'erreurs, c'est ce que j'ai finalement trouvé et cela fonctionne:
J'ai créé un nouveau fichier objective-c (.m) et y ai copié tout mon code C.
J'ai laissé des fichiers .h intacts (l'en-tête de pontage généré par XCode et mon propre fichier .h avec une déclaration de fonctions publiques). Maintenant, ma structure de projet ressemblait à ceci:
Dans mon fichier dict.m à la place de la précédente plaine c fopen
:
FILE *dic = fopen("dictionary.txt", "r");
J'ai ajouté le code obj-C:
NSString *filePath = [[NSBundle mainBundle] pathForResource:@"dictionary" ofType:@"txt"];
FILE *dic = fopen([filePath cStringUsingEncoding: NSUTF8StringEncoding], "r");
Et cela fonctionne maintenant sans aucun problème! C'est juste incroyable!
ps J'ai décidé d'écrire cette réponse au cas où cela aiderait quelqu'un comme moi et lui ferait gagner du temps. Si vous savez comment changer le répertoire de travail dans XCode 9 pour iOS, laissez-moi un commentaire, je suis maintenant vraiment curieux de savoir pourquoi je ne le trouve pas.