2014-04-27 45 views
0

我的程序应该打开一个文件,使用argv[1]从命令行检索文件路径。奇怪的字符串结果

然后我尝试使用fopen打开文件,但是我的程序崩溃,因为我使用的文件路径不包含双反斜杠,所以fopen不起作用。

我试图写我自己的转换函数,并使用打印检查结果看起来不错,一见钟情。

的问题是,当我使用返回为const char *作为参数,它给了我一个奇怪的结果..我的代码:

#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; 
} 

打开DBC文件,我的计划给了我以下结果:

D:\\Achievement.dbc 
a 

因此它看起来像const char* file只包含1个字符的文件路径,为什么?

+6

你依赖于未定义的行为,从本地字符串返回'c_str()'是一个非常糟糕的主意。只需返回字符串,并从'OpenDBC'中调用'c_str()'。 – Chnossos

+1

@ Chnossos的评论是正确的,但我也很好奇这个声明:“我的程序崩溃,因为我使用的文件路径不包含双反斜杠,所以fopen不起作用”。除了在程序的源代码中指定路径时,通常不需要转义反斜杠。 –

+1

根本不需要'ConvertToPath',只需调用'fopen(argv [1])'并查看结果。 – CiaPan

回答

1

根本不需要ConvertToPath函数。只有字符串文字需要双反斜杠。从来没有像std :: string这样的变量。

-1

我编译Linux上的代码,并不能复制你的结果

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

后来的运行./filereader "D:\\Achievement.dbc"结果

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

运行./filereader "D:\\\\Achievement.dbc"结果是你想要的,因为命令是什么行参数需要被转义。然后你可以删除ConvertToPath

+0

未定义的行为可以通过很多方式表现出来:http://stackoverflow.com/a/6445794/12711 –

+0

日本人,你是对的。还有一个指针问题。 –