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;
}
답변
@BoundaryImposition이 이미 지적한대로 "\b"
을 파일에 쓰면 실제로 파일에 이진 백 스페이스 문자가 기록됩니다. 대신 원하는 것은 myFile.seekp(-1, std::ios_base::cur);
입니다. win/dos 컴퓨터를 사용하는 경우 '\n'
문자로 특별히주의해야 할 수도 있습니다. 문자 스트림에 쓸 때 0x0d 0x0a
으로 변환되므로 (1에서 2 위치로 되돌아 가야하기 때문입니다). 당신은 매우 큰 파일을 처리하지 않을 경우
그러나 일반적으로, 단지에 컨텐츠를 저장하는 방법이 쉬울 것입니다 및 때 파일에 기록 (필요한 경우 문자를 제거하는 pop_back
또는 erase
를 사용) std::string
완료되었습니다.
"임의의 문자"가 아닙니다. 그것들은 백 스페이스 문자입니다! 입력 한 것과 정확히 일치합니다.
이것은 16 진수 편집기로 확인하거나 hexdump
등을 통해 프로그램의 출력을 파이프 할 수 있습니다.
일반적인 쉘의 동작을 복제하려면 백스 페이스 문자를 식별하고 myFile
에 추가하는 대신 이전에 입력 한 문자를 제거하는 코드를 직접 작성해야합니다.
그리고이 프로그램은 확실히 C가 아닙니다! –
어떻게 작동할까요? 나는 I/O를 파일링 할 수있는 멍청이이다. 왜냐하면 내가 전에 말했던 것은 터미널이 파일과 문자를 다르게 가져 간다는 것이었기 때문이다. – TheScripterGeek
@TheScripterGeek 많은 시스템에서 터미널은 파일입니다. – user4581301
Off topic : 스트림에 대한 예외를 켜야합니다. 기본적으로 스트림은 버리지 않습니다. 일반적으로 입력 오류가 예외적 인 것으로 간주하기에는 너무 일반적이기 때문에 일반적으로 도움이됩니다. 스트림이 오류를보고 한 경우 'if (! myFile)'가 'if'의 본문에 들어가는 객체를 테스트하여 스트림 연산에서 성공했는지 테스트 할 수 있습니다. 어쨌든 예외를 원한다면 다음을 읽어보십시오 : http://en.cppreference.com/w/cpp/io/basic_ios/exceptions – user4581301