내 프로그램에서 파일을 열어야하며 파일 경로는 argv[1]
을 사용하여 명령 줄에서 검색됩니다.이상한 문자열 결과
나는 fopen을 사용하여 파일을 열려고하지만 파일 경로에 이중 백 슬래시가 없으므로 fopen이 작동하지 않으므로 프로그램이 충돌합니다.
필자는 자신의 변환 함수를 작성하고 결과를 확인하기 위해 print를 사용하여 첫눈에 좋았습니다.
#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 파일 열기 나에게 다음과 같은 결과를 제공합니다 :
문제는 내가 인수로 * 반환 CONST 문자를 사용할 때 .. 나에게 이상한 결과를 제공 내 코드이다
D:\\Achievement.dbc
a
const char* file
에는 파일 경로의 1 문자 만 포함됩니다. 이유는 무엇입니까?
당신은 정의되지 않은 행동에 의존하고 있습니다. 지역 문자열에서'c_str()'을 반환하는 것은 정말 나쁜 생각입니다. 그냥 대신 문자열을 반환하고'OpenDBC' 내부에서'c_str()'을 호출하십시오. – Chnossos
@ Chnossos의 코멘트는 정확하지만이 문장에 대해서도 궁금합니다. "사용하는 파일 경로에 이중 백 슬래시가 없으므로 fopen이 작동하지 않기 때문에 프로그램이 다운됩니다." 일반적으로 경로가 프로그램의 소스 코드에서 지정되는 경우를 제외하고는 백 슬래시를 이스케이프 할 필요가 없습니다. –
당신은'ConvertToPath'를 전혀 필요로하지 않고 단지'fopen (argv [1])'을 호출하고 결과를 볼 수 있습니다. – CiaPan