2013-07-06 5 views
2

그래서 현재 I/O, 파일 쓰기 등의 학습 프로젝트로 라인 편집기를 작성하고 있습니다. 이것은 C++로 작성되었으며, 현재 사용자가 선택한 파일을 작성하려고합니다. CLI 인수가 구현되어 있지만 현재 쓰기 위해 파일을 지정하는 프로그램 방식을 구현하는 방법을 알지 못합니다.C++ : cin >> * char

char *filename; 
if (argc >= 2){ 
     filename = argv[1]; 
} else{ 
     cout << "file>"; 
     cin >> filename; 
     cin.ignore(); 
} 

이것은 명령 행 인수를 사용할 때 완벽하게 작동합니다. 그러나, 내가하지 않을 때마다, 내가 프로그램을 시작하자마자, 그것은 Segmentation Faults입니다. 실제 파일 이름을 사용하는 장소는 저장 명령에 있습니다.

void save(char filename[], int textlen, string file[]){ 
     ofstream out(filename); 
     out << filestring(textlen, file); 
     out.close(); 
} 

또한 완벽하게 작동합니다. 네가 나를 도울 수있는 방법이 있니? 검토를위한 전체 소스 코드는 https://github.com/GBGamer/SLED에 있습니다.

+1

사용 ['표준 : string'] (http://en.cppreference.com/w/cpp/string/basic_string) 및 (HTTP [이 읽기] : //chris-sharpe.blogspot합니다. co.uk/2013/05/reading-input-with-stdgetline.html) (자체 플러그). – BoBTFish

+0

문제는 ofstream입니다. 정확하게 기억한다면 문자열을 입력으로 사용할 수 없습니다. 문자열을 사용하는 다른 방법이 있습니까? – ubsan

+1

문자열은 const char * 형식을 반환하는 변환 함수'c_str()'을 가지고 있습니다. – suspectus

답변

2

문제는 char* filename은 문자가 들어있는 메모리에 대한 포인터 일뿐입니다. 그것은 메모리 자체를 소유하지 않습니다. 명령 줄 인수를 사용하면 프로그램에서 해당 문자열을 어딘가에 저장하고 포인터를 얻습니다. cin >> filename을 사용하여 읽을 때 실제로는 읽은 데이터를 저장할 위치가 없습니다.

해결책 : char* filenamestd::string filename (및 #include <string>)으로 대체하십시오.

그런 다음 출력 파일을 열려면 C 스타일 문자열 (null로 끝나는 char 배열)이 필요합니다. std::string에는이 기능이 있습니다. 당신이 C++ 11 개 기능을 가진 최신 컴파일러를 사용할 수있는 경우는, 사실,

std::ofstream out(filename.c_str()); 
          ^^^^^ 

를 작성하거나 것, 당신도 c_str()를 사용할 필요가 없습니다. 새 std::ofstream constructor이 추가되어 std::string을 허용합니다. 명령 행 인수가 제공 argv[1]

+0

그러나 ofstream을 사용하는 것은 어떻습니까? 문자열을 허용하는 대안이 있습니까? 편집 : 신경 쓰지 마세요, 용의자를 보았다. – ubsan

+0

정말 고마워요! 그것은 완벽하게 작동합니다. – ubsan

0

귀하의 filename 변수 포인트, 그것은 할당 할 메모리를 필요로하지 않지만 else 블록에 갈 때, 당신은 filename에 메모리를 할당하지 않았습니다. 그것의 포인터.

malloc을 사용하여 filename 메모리를 할당하고 사용자 입력을받습니다.

filename = (char *)malloc(sizeof(char)*(FILE_NAME_LENGTH+1)) 
+0

와우, 워, 워! 진심으로? 입력을 다루는 법을 배우기 시작한 사람을위한 최상의 솔루션은'malloc '을 이용한 수동 메모리 관리라고 생각하십니까? – BoBTFish

+0

저는 누군가 std 네임 스페이스의 기능을 사용하기 전에 C를 배운다고 생각합니다. 나는 std :: string과 같은 것을 사용하기 오래 전에 malloc을 배웠다. 누군가가 세분화 오류를 얻는다면, 이유를 말하면 기억에 대한 설명을 피할 수 없습니다. 그리고 일부 포인터 변수에 메모리를 할당하는 것은 수동 메모리 관리에서 매머드가 아닙니다. –

+0

사용법을 배우기 전에'std :: string'을 작성하는 법을 배워야한다는 말입니다. 그리고'new' /'delete' /'RAII'가 상당히 초기에 배워 져야한다고 동의하지만, 사용자 상호 작용을 다루는 가장 좋은 방법과는 완전히 별개입니다.그리고 당신의 대답은 (그리고 개인적으로 받아들이지 마십시오. 나는 대답이 너무 짧습니다.) 아무 것도 할 수 없을 정도로 자세가 없지만이 주제와 관련하여 혼란을 야기합니다. – BoBTFish