2017-04-08 3 views
0
내가 텍스트 파일을 선택하고 내가 백 스페이스를 누르면, 내가 문서를 확인하고 내가 텍스트 문서를 확인할 때, 나는과 같이 임의의 문자를받을 때마다
int main(){ 
std::cout << "Insert file name/or path. \n NOTE: ONLY INPUTS. DELETES PREVIOUS DATA.\nV.6" << std::endl; 
std::string filen; 
std::cin >> filen; 
std::ofstream myFile; 
try{ 
myFile.open(filen, std::ios::out); 
} 
catch(std::fstream::failure){ 
std::cout << "Could not open file!\n Make sure the name and data type are valid."; 
system("pause"); 
} 
while(true){ 
    int press = getch(); 
    if(press == 43) myFile.close(); 
    if(press == 8){myFile << "\b" << " " << "\b";std::cout << "\b" << " " << "\b" << std::flush;} 
    if(press == 13){ myFile << "\n"; std::cout << "\n" << std::flush;} 
    if(press != 43 && press != 127 && press != 13 && press != 8){myFile << (char)press;std::cout << (char)press;} 
     } 
return 0; 
} 

:는 파일에서 백 스페이스를 작성

Random Characters

+1

Off topic : 스트림에 대한 예외를 켜야합니다. 기본적으로 스트림은 버리지 않습니다. 일반적으로 입력 오류가 예외적 인 것으로 간주하기에는 너무 일반적이기 때문에 일반적으로 도움이됩니다. 스트림이 오류를보고 한 경우 'if (! myFile)'가 'if'의 본문에 들어가는 객체를 테스트하여 스트림 연산에서 성공했는지 테스트 할 수 있습니다. 어쨌든 예외를 원한다면 다음을 읽어보십시오 : http://en.cppreference.com/w/cpp/io/basic_ios/exceptions – user4581301

답변

2

@BoundaryImposition이 이미 지적한대로 "\b"을 파일에 쓰면 실제로 파일에 이진 백 스페이스 문자가 기록됩니다. 대신 원하는 것은 myFile.seekp(-1, std::ios_base::cur);입니다. win/dos 컴퓨터를 사용하는 경우 '\n' 문자로 특별히주의해야 할 수도 있습니다. 문자 스트림에 쓸 때 0x0d 0x0a으로 변환되므로 (1에서 2 위치로 되돌아 가야하기 때문입니다). 당신은 매우 큰 파일을 처리하지 않을 경우

그러나 일반적으로, 단지에 컨텐츠를 저장하는 방법이 쉬울 것입니다 및 때 파일에 기록 (필요한 경우 문자를 제거하는 pop_back 또는 erase를 사용) std::string 완료되었습니다.

4

"임의의 문자"가 아닙니다. 그것들은 백 스페이스 문자입니다! 입력 한 것과 정확히 일치합니다.

이것은 16 진수 편집기로 확인하거나 hexdump 등을 통해 프로그램의 출력을 파이프 할 수 있습니다.

일반적인 쉘의 동작을 복제하려면 백스 페이스 문자를 식별하고 myFile에 추가하는 대신 이전에 입력 한 문자를 제거하는 코드를 직접 작성해야합니다.

+0

그리고이 프로그램은 확실히 C가 아닙니다! –

+0

어떻게 작동할까요? 나는 I/O를 파일링 할 수있는 멍청이이다. 왜냐하면 내가 전에 말했던 것은 터미널이 파일과 문자를 다르게 가져 간다는 것이었기 때문이다. – TheScripterGeek

+0

@TheScripterGeek 많은 시스템에서 터미널은 파일입니다. – user4581301