2014-04-27 2 views
0

Mon programme devrait ouvrir un fichier, le chemin du fichier est récupéré à partir de la ligne de commande en utilisant argv[1]. J'essaie ensuite d'ouvrir le fichier en utilisant fopen mais mon programme se bloque car le chemin de fichier que j'utilise ne contient pas de double barre oblique inverse, fopen ne fonctionne donc pas.Résultat de chaîne étrange

J'ai essayé d'écrire ma propre fonction de conversion et en utilisant l'impression pour vérifier que le résultat était bon à première vue.

Le problème est que lorsque j'utilise le const char * comme argument retourné il me donne un résultat bizarre .. mon code:

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


const char* ConvertToPath(std::string path) 
{ 
    std::string newpath = ""; 
    for(unsigned int i = 0; i < path.length(); ++i) 
    { 
     if(path[i] == '\\') 
     { 
      newpath += "\\\\"; 
     } 
     else 
     { 
      newpath += path[i]; 
     } 
    } 
    printf("%s \n", newpath.c_str()); 
    return newpath.c_str(); 
} 

bool OpenDBC(const char* path) 
{ 
    const char* file = ConvertToPath(path); 
    printf("%s \n", file); 
    FILE* dbc = fopen(file, "rbw"); 
    if (!dbc) 
     return false; 
    return true; 
} 

int main(int argc, char* argv[]) 
{ 
    if (argc < 2) 
    { 
     printf("Error, expected DBC file."); 
     getchar(); 
     return -1; 
    } 

    if (!OpenDBC(argv[1])) 
    { 
     printf("There was an error opening the DBC file."); 
     getchar(); 
     return -1; 
    } 
    getchar(); 
    return 0; 
} 

Ouverture d'un fichier DBC avec mon programme me donne le résultat suivant:

D:\\Achievement.dbc 
a 

Donc, il semble que const char* file ne contient que 1 caractère du chemin du fichier, pourquoi?

+6

Vous comptez sur Undefined Behavior, retourner 'c_str()' à partir d'une chaîne locale est une très mauvaise idée. Renvoyez simplement la chaîne et appelez 'c_str()' depuis 'OpenDBC'. – Chnossos

+1

@ Commentaire de Chnossos est correct, mais je suis également curieux de cette déclaration: "mon programme se bloque parce que le chemin de fichier que j'utilise ne contient pas de double barre oblique inverse, donc fopen ne fonctionne pas". Vous ne devriez généralement pas avoir besoin d'échapper les barres obliques inverses sauf si le chemin est spécifié dans le code source du programme. –

+1

Vous n'avez pas besoin de 'ConvertToPath', appelez' fopen (argv [1]) 'et voyez les résultats. – CiaPan

Répondre

1

Vous n'avez absolument pas besoin de la fonction ConvertToPath. Les antislash doubles ne sont nécessaires que dans les littéraux de chaîne. Jamais dans des variables comme une chaîne std ::.

-1

Je compilé votre code sur Linux et ne peut pas répliquer le résultat

Exécution ./filereader "D:\\Achievement.dbc" résultats dans

D:\\Achievement.dbc 
D:\\Achievement.dbc 

Courir ./filereader "D:\\\\Achievement.dbc" résultats dans

D:\\\\Achievement.dbc 
D:\\\\Achievement.dbc 

Ce dernier est ce que vous voulez parce que le commandement les arguments de ligne doivent être échappés. Ensuite, vous pouvez supprimer le ConvertToPath.

+0

Un comportement indéfini peut se manifester de plusieurs façons: http://stackoverflow.com/a/6445794/12711 –

+0

Jap, vous avez raison. Il y a aussi un problème de pointeur. –