2010-07-18 9 views
3

Peut-être que je juste un autre en noir, mais celui-ci ligne me donne beaucoup de problèmes:fopen échoue mystérieusement sous Windows

FILE *fp = fopen("data/world.data", "rb"); 

Cela fonctionne très bien sous Linux lorsqu'il est compilé avec GCC. Mais quand je compile avec Visual Studio, il se bloque. fp est toujours NULL. Le BIN et le EXE sont dans le même répertoire. Maintenant, pour rendre les choses encore plus folles, quand je lance l'EXE en utilisant Wine sous Linux ... ça marche ...

Je n'ai absolument pas une bonne idée de ce qui se passe ici. Peut-être que c'est une erreur incroyablement stupide de mon côté, mais je ne peux pas exécuter cette chose sous Windows:/

Aussi, j'ai un autre programme qui fonctionne très bien, là les fichiers de données sont également contenus dans un sous-répertoire nommé données .

EDIT:
Pour bien faire comprendre ni /NOR `\ * fonctionnent.

EDIT 2:
OK J'ai renoncé à ce sujet, peut-être quelqu'un a le plaisir d'essayer de le comprendre, voici ZIP contenant le fichier EXE, données de débogage pour VS etc .:
https://dl.dropbox.com/u/2332843/Leaf.zip

EDIT 3:
Compilé avec CodeBlocks et MinGW, fonctionne comme un charme. Devinez qu'il doit faire quelque chose avec MSVC ou les paramètres du projet dans VS.

+5

essayez de changer "data/world.data" en "data \\ world.data" –

+2

J'aurais dû le poster comme réponse ... -_- –

+1

@Justin Ethier: lire http://msdn.microsoft. com/fr-fr/library/77859s1t (v = VS.71) .aspx – akira

Répondre

-1

Je ne suis pas sûr, mais il se peut que ce soit parce que vous utilisez une barre oblique à la place d'une barre oblique inverse (une barre oblique inversée) dans le chemin?

+1

L'autre programme utilise également '/', et je l'ai déjà essayé avec '\\', pas de différence juste un autre crash:/ –

+0

Vous pouvez utiliser des barres obliques à la place des barres obliques inversées sur win2000, et winxp sans problème. Ils peuvent causer des problèmes sur win98 et ci-dessous. Je ne sais pas si c'est une fonctionnalité documentée ou si elle est officiellement supportée sur Vista ou au-dessus. – SigTerm

+0

@SigTerm: * toutes * les versions de Windows ont bien accepté les barres obliques - et MS-DOS en a fait de même pour les premières versions qui prenaient en charge les sous-répertoires (2.x). Une (très) peu de versions antérieures de MS-DOS vous a même permis de définir '/' et '-' à la place de '\' et '/' (par exemple, suivez les conventions UNIX) sur la ligne de commande. –

6

Il semble que data n'est pas un sous-répertoire de votre actuel répertoire lorsque vous exécutez le programme. Par défaut (pour les cibles x86) VS va générer et exécuter votre programme à partir d'un sous-répertoire DEBUG ou RELEASE du répertoire de base que vous avez créé pour le projet. Vous pouvez modifier le répertoire qui sera "en cours" lorsqu'il est exécuté (par exemple, projet | propriétés | propriétés de configuration | débogage pour VS 2008).

Edit: Alors que Windows exige que vous utilisez une barre oblique inverse comme séparateur de répertoire à la ligne de commande, une barre oblique fonctionne bien dans le code - c'est pas la source de votre problème.

+0

J'ai déplacé le programme à quelques endroits différents avec les données dossier, sur mon bureau dans le Dropbox où je peux l'exécuter à la fois sur Win et Linux, il se bloque toujours sur Win, mais il fonctionne très bien sous Wine. –

+1

@Ivo: avez-vous essayé d'utiliser un chemin d'accès absolu à votre répertoire de données, pour vous assurer qu'il est détecté quel que soit l'emplacement de l'exécutable? –

+0

J'ai essayé presque tout maintenant, j'ai déplacé le code qui appelle la fonction qui contient l'appel fopen, enlevé d'autres appels à fopen etc. C'est juste l'appel à 'fopen (" data/world.data "," rb ");' qui échoue, j'en ai d'autres qui réussissent Je suppose que je vais essayer de le compiler avec Code :: Blocks, Visual Studio est donc F *** ING SLOW sur mon netbook de toute façon. , Je l'ai déjà essayé sur un autre Windows Machine –

0

Incluez une ligne dans GetCurrentDirectory(), pour voir si vous exécutez à partir du répertoire prévu.

Lorsque je développe en C#/C++ sur Visual Studio, je peux normalement l'exécuter à partir du dossier de débogage. Je ne pense pas que ce soit important si la barre oblique est utilisée à la place de la barre oblique inversée dans .net.

2

Dans les fenêtres, vous devez écrire ce qui suit:

FILE *fp = fopen("data\\world.data", "rb"); 

C'est comme ça parce que la barre oblique inverse est un caractère spécial (donc une barre oblique inverse dans une chaîne est écrite en utilisant \ et un symbole de citation est \ » et donc avec d'autres caractères spéciaux.)

1

Depuis ce problème se produit uniquement sur les fenêtres.Je doute que le fichier soit vraiment nommé "world.data". Comme vous le savez, le paramètre par défaut pour Windows masque l'extension du fichier. Est-ce que son vrai nom est world.data.xxx?

0

J'ai eu le même problème, et soudainement je l'ai compris.

Cela devrait être votre faute Windows. Par exemple, FILE *fp = fopen("data/world.data", "rb"); dans windows, si vous masquez les extensions, alors vous pouvez voir le fichier data/world.data, mais en fait c'est peut-être /data/world.dat.txt ou un peu.

Veuillez donc vérifier les extensions.

J'espère que ça aide!

+0

Il y a une leçon ici: toujours désactiver le masquage des extensions, non seulement cela empêche ce genre de confusion, mais quand vous recevez un email contenant hello.dat qui est vraiment hello.dat.exe vous ne l'ouvrez pas accidentellement :) – Andrew

+1

Étant donné les autres indices dans les questions et les commentaires, ce n'est pas le problème cette fois.Vous avez raison, cependant, que MS * extensions cachées * provoque le chagrin et il vaut la peine d'un double contrôle. –

0

Je me suis heurté à cela aujourd'hui, et c'est arrivé parce que j'ai utilisé "br" au lieu de "rb" sur cet argument de mode.

La fopen sous-jacente déclenche une exception quelconque, qui ne peut être enregistrée que comme une panne. Cela ne dérange pas de retourner la réponse NULL standard ou de définir les valeurs d'erreur associées.