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?
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
@ 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. –
Vous n'avez pas besoin de 'ConvertToPath', appelez' fopen (argv [1]) 'et voyez les résultats. – CiaPan