2017-04-08 63 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

題外話:你需要打開的流異常。默認情況下,流不會拋出。通常情況下更好,因爲輸入錯誤太常見,不被視爲例外。您可以通過測試對象'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(因此他們需要尋求回2個職位,而不是1)。

但是總體來說,如果你不處理非常大的文件,這將是比較容易的方式只是內容存儲在std::string(使用pop_backerase,如果需要刪除字符),你當它寫到文件完成。

4

那些不是「隨機字符」;那些是退格字符!即您輸入的內容。

這可以用十六進制編輯器(或管道程序的輸出通過hexdump等人)中進行驗證。

如果您希望複製常見shell的行爲,您必須編寫自己的代碼來標識退格字符,而不是將其附加到myFile,而是刪除以前輸入的字符。

+0

而這個程序絕對不是C! –

+0

這將如何工作?我很喜歡寫I/O,因爲我之前被告知終端的字符與文件不同。 – TheScripterGeek

+0

@TheScripterGeek在許多系統上,終端是一個文件。 – user4581301